[英]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.