Java中从二维数组获取列

8
在一个二维数组中,我可以轻松地获取行数组,但如何将列作为数组获取呢?我需要一个适用于对象以及基本类型的解决方案。谢谢。
        int counter = 1;
    int[][] matrix = new int[9][9];

    for (int x = 0; x < matrix.length; x++) {
        for (int y = 0; y < matrix[0].length; y++) {
            matrix[x][y] = counter;
            System.out.print(counter + " ");
            counter++;
        }
        System.out.println();
    }

    for (int x = 0; x < matrix.length; x++) {
        int[] row = matrix[x];  
    }

如果其中一个答案解决了您的问题,请将其标记为被接受的答案。 - SvenT23
7个回答

14

没有“开箱即用”的方法,但你可以创建一个静态方法来实现:

public static Object[] getColumn(Object[][] array, int index){
    Object[] column = new Object[array[0].length]; // Here I assume a rectangular 2D array! 
    for(int i=0; i<column.length; i++){
       column[i] = array[i][index];
    }
    return column;
}

array[0].length替换为array.length对于非矩形数组是最优的。 - Ali.Wassouf

12

这里有一个使用Java 8流的方法:

int[] getColumn(int[][] matrix, int column) {
    return IntStream.range(0, matrix.length)
        .map(i -> matrix[i][column]).toArray();
}

如果您想处理太短的行:

int[] getColumn(int[][] matrix, int column, int defaultVal) {
    return IntStream.range(0, matrix.length)
        .map(i -> matrix[i].length < column ? defaultVal : matrix[i][column])
        .toArray();
}

2
你可以这样做:

最初的回答

private <T> T[] getColumn(int address, T[][] from) {
    return (T[]) Arrays.stream(from).map(x -> x[address]).toArray(Object[]::new);
}

1
你可以这样做:

for(int row = 0; row < numRows; row++) {
    colArray[row] = my2Darray[row][columnOfInterest];
}

Apache Commons有相关工具,可以查看this answer


1

这里是另一个适用于对象的Java 8答案:

// Make 2D array of objects
Obj[][] obj = {{new Obj(0),new Obj(1)},{new Obj(2),new Obj(3)}};

// To get a row:
int rowToGet = 1;
Obj[] oRow = obj[rowToGet];

// To get a column:
int colToGet = 1;
Obj[] oCol = Arrays.stream(obj).map(o -> o[colToGet]).toArray(Obj[]::new);

// Print the row:
System.out.println(Arrays.toString(oRow));
// Print the column:
System.out.println(Arrays.toString(oCol));

// Here is the object used for this example
class Obj {
    int in;
    String str;

    public Obj(){};

    public Obj(int in){
        this.in = in;
        switch(in){
            case 0:
                str = "zero";
                break;
            case 1:
                str = "one";
                break;
            case 2:
                str = "two";
                break;
            case 3:
                str = "three";
                break;
        }
    }

    @Override
    public String toString(){
        return String.format("%d=%s",in,str);
    }
}

这将产生以下输出:
提取的行:[2=two,3=three] 提取的列:[1=one,3=three]

0

没有简单的方法。您必须遍历数组并自己构建列数组。

请注意,如果您的二维数组具有不同长度的行,则“列数组”未被很好地定义。例如,如果第二行只有2列,那么您如何创建第三列数组?

如果您的二维数组是矩阵(即所有行的长度相同),则很容易创建一个二维数组,其行是原始二维数组的列。然后您可以轻松获得原始数组的列。


0

如上所述,没有直接的方法来获取列长度,但是有解决方案。

out[][]=new String[a][b] // Example of multidimensional array

获取列的长度,out[][]的长度 请执行以下操作:
String []temp = out[a] //a = index of row of which columns you want
int length = temp.legnth;

抱歉,我不太擅长解释。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接