繁体   English   中英

Java,使用动态行和列转置二维数组

[英]Java, transpose a 2d array with dynamic rows and columns

我免于转置矩阵,其中行的列数不同。 例如我正在尝试的是

public Object[][] transpose (Object[][] data) {
    Object temp = new Object[data[0].length][];
    for (int i = 0; i < data.length; i++) {
         temp[i] = new Object[data[i].length];
         for ( int j = 0; j < data[i].length; j++) {
              temp[j][i] = data[i][j]
         }
    }
    return temp;
}

看来第四行工作不正常,我不太确定如何解决它。

如果您的输入如下所示:

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

转置的结果可能是以下之一:

        SIMPLE                 COMPACT
[ [    1, 3,    7 ],      [ [    1, 3, 7 ],
  [    2, 4, null ],        [    2, 4    ],
  [ null, 5, null ],        [ null, 5    ],
  [ null, 6, null ] ]       [ null, 6    ] ]

无论哪种情况,结果的列数应与最长的行(而不是第一行)一样多。

public static Object[][] transposeSimple(Object[][] data) {
    int maxLen = 0;
    for (Object[] row : data)
        if (row.length > maxLen)
            maxLen = row.length;
    Object[][] temp = new Object[maxLen][data.length];
    for (int i = 0; i < data.length; i++)
        for (int j = 0; j < data[i].length; j++)
            temp[j][i] = data[i][j];
    return temp;
}
public static Object[][] transposeCompact(Object[][] data) {
    int maxLen = 0;
    for (Object[] row : data)
        if (row.length > maxLen)
            maxLen = row.length;
    Object[][] temp = new Object[maxLen][];
    for (int i = 0; i < temp.length; i++) {
        for (maxLen = data.length; maxLen > 0; maxLen--)
            if (data[maxLen - 1].length > i)
                break;
        temp[i] = new Object[maxLen];
        for (int j = 0; j < maxLen; j++)
            if (i < data[j].length)
                temp[i][j] = data[j][i];
    }
    return temp;
}

测试

System.out.println(Arrays.deepToString(transposeSimple(new Object[][] {
        { 1, 2       },
        { 3, 4, 5, 6 },
        { 7          },
})));
System.out.println(Arrays.deepToString(transposeCompact(new Object[][] {
        { 1, 2       },
        { 3, 4, 5, 6 },
        { 7          },
})));

产量

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM