将列表转换为二维数组(Java)

将列表转换为二维数组(Java),java,multidimensional-array,Java,Multidimensional Array,我是编程初学者,我有一个方法: public int[][] toArray(List<Integer> list, int rows) { int[][] result = new int[list.size()][rows]; int i = 0; int j = 0; for (Integer value : list) { result[i][j] = value;

我是编程初学者,我有一个方法:

 public int[][] toArray(List<Integer> list, int rows) {
        int[][] result = new int[list.size()][rows];
        int i = 0;
        int j = 0;
            for (Integer value : list) {
                result[i][j] = value;
                j++;
                if(j > rows - 1){
                    i++;
                    j = 0;
                }
            }
        return result;
    }
如果
rows=3
结果为:

[[1, 2, 3], [4, 5, 6], [7, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
我需要什么

[[1, 2], [3, 4], [5, 6], [7, 0]] 

[[1, 2, 3], [4, 5, 6], [7, 0, 0]]

如何操作?

您可以使用
计数器
跟踪计数,并通过
计数器/行
计数器%行
确定位置,例如:

public int[][] toArray(List<Integer> list, int rows) {
    int[][] result = new int[list.size()][rows];
    int counter = 0;
    for (Integer value : list) {
        result[counter/rows][counter%rows] = value;
        counter++;
    }
    return result;
}
public int[]toArray(列表,int行){
int[][]结果=新的int[list.size()][行];
int计数器=0;
for(整数值:列表){
结果[计数器/行][计数器%行]=值;
计数器++;
}
返回结果;
}

您不必担心剩余的位置,因为当您声明一个大小为的数组时,所有
MxN
元素都被初始化为0。

问题在于这一行代码:

int[][] result = new int[list.size()][rows];
当您将结果初始化为行数等于list.size()的2D数组时,始终会得到七行。解决方案是首先正确地计算结果数组的行数,然后初始化它

int resultRows = list.size()/rows;
if(list.size()%rows!=0){
    resultRows++;
}
int[][] result = new int[resultRows][rows];

为了好玩,这里有另一种使用溪流和番石榴的方法:

public static int[][] toArray(List<Integer> list, int rows) {
    return Lists.partition(list, rows)
            .stream()
            .map(Ints::toArray)
            .map(a -> Arrays.copyOf(a, rows))
            .toArray(int[][]::new);
}
publicstaticint[]toArray(列表,int行){
返回列表。分区(列表,行)
.stream()
.map(Ints::toArray)
.map(a->Arrays.copyOf(a,行))
.toArray(int[]]::新建);
}

int[]result=newint[rows][(int)(list.size()/rows)]可能更好。通常,双维数组是int[rows][columns]。通过使用调试器或打印语句,或者更好地使用一张纸和一支笔。。。观察代码正在执行的操作。你可以通过努力学习这些东西,直到找到解决办法。有时这需要几个小时。绕道对您没有帮助。列=大小/rows@Brianbcr666Ray使用
int[]result=newint[rows][(int)(list.size()/rows)]
我获得ArrayIndexOutofBoundsCeption方法的近似速度(在
纳秒内
)和列表包含从1到7的数字,
行=3
为:38321。我的方法(使用@mesbah help)显示了结果:5135。在抛出数字之前,您可能希望阅读Java中的过早优化和微基准标记。
public static int[][] toArray(List<Integer> list, int rows) {
    return Lists.partition(list, rows)
            .stream()
            .map(Ints::toArray)
            .map(a -> Arrays.copyOf(a, rows))
            .toArray(int[][]::new);
}