Java - 添加行是否有更有效的方法?

时间:2013-05-03 03:40:48

标签: java row

下面是代码,我只是想知道其他人是否对它进行了不同的编码。也许我可以做一些小改动。提前谢谢!

public class addRow {

    public static int[][] insert(int [][] a, int [] row, int index){

        int [][] x = new int[a.length+1][a.length];
        int [] temp;

        for(int i=0; i<x.length-1; i++)
        {
            x[i] = a[i];

            if(i == index)
            {
                temp = a[i];
                x[i] = row;
                x[i+1] = temp;          
            }           
        }
        return x;
    }

    public static void main(String[] args){
        int[][] a = {{1,2,3},{4,5,6},{10,11,12}};
        int[] row = {7,8,9};

        int [][] b = insert(a,row ,2);


        for(int r=0; r < b.length; r++){
            for(int c=0;c< b[r].length; c++){
                System.out.print(b[r][c] + " ");
            }System.out.println();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

System.arraycopy是你的答案。

http://docs.oracle.com/javase/6/docs/api/java/lang/System.html#arraycopy%28java.lang.Object,%20int,%20java.lang.Object,%20int,%20int%29

它使用本机代码直接在内存中复制数组,从而提高效率。

答案 1 :(得分:1)

你的循环不符合你的想法。当您在i中交换行i+1x时,循环的下一次迭代将覆盖您在上一次迭代中放入x[i+1]的元素。您需要保留一个额外的索引(或拆分循环),以便在点击a后跟踪xindex之间的位置差异。但是,更好的方法是使用System.arraycopy

此外,没有理由在其初始化程序中为x行分配空间,因为无论如何都要为a(或row)分配元素。我的方法版本是:

public static int[][] insert(int [][] a, int [] row, int index){
    int[][] x = new int[a.length + 1][]; // no second dimension
    System.arraycopy(a, 0, x, 0, index);
    x[index] = row;
    System.arraycopy(a, index, x, index + 1, a.length - index);
    return x;
}

答案 2 :(得分:0)

仅仅因为您的代码似乎适用于1案例,它并不意味着它是正确的。您也尝试过其他案例。

您需要在方法中进行以下更改才能使其正常工作。

public static int[][] insert(int [][] a, int [] row, int index){

    int [][] x = new int[a.length+1][a.length];
    int j = 0; // New counter for array `a`
    // Also `temp` array removed. Not required at all.
    for (int i = 0; i < x.length; i++) {
        x[i] = a[j];
        if (i == index) {
            x[i] = row;
            x[i + 1] = a[j];
        } else {
            j++;
        }
    }
    return x;
}

这是您可以优化代码的最大值,而不会更改代码的基础。

现在关于优化大时间,正如其他人建议的那样,您可以使用System#arrayCopy