我有小问题,我有二维数组:
Tab1 = {1,2,3} {1,2,3}
Tab2 = {1,2} {1,2}
现在我必须将数组连接到第三个数组,并将行中缺少的元素设置为零:
Tab3 ={1,2,3} {1,2,3} {1,2,0} {1,2,0}
我的代码:
int[][] tab1 = new int[][]{{1,2,3},{1,2,3}};
int[][] tab2 = new int[][] {{1,2},{1,2}};
int[][] tab = new int[tab1.length+tab2.length][];
System.arraycopy(tab1,0,tab,0,tab1.length);
System.arraycopy(tab2, 0, tab, tab1.length,tab2.length);
System.out.println(Arrays.deepToString(tab));
输出
[1, 2, 3], [1, 2, 3], [1, 2], [1, 2]
如何将缺少的元素设置为0?
答案 0 :(得分:1)
最简单的解决方案是在将tab2
复制到新数组之前用{0}填充所需的零。
int[][] tab1 = new int[][] {{1,2,3}, {1,2,3}};
int[][] tab2 = new int[][] {{1,2,0}, {1,2,0}}; // pad with trailing zeros
int[][] tab = new int[tab1.length+tab2.length][];
System.arraycopy(tab1, 0, tab, 0, tab1.length);
System.arraycopy(tab2, 0, tab, tab1.length, tab2.length);
System.out.println(Arrays.deepToString(tab));
答案 1 :(得分:1)
你不能“将缺失的元素设置为0”,因为它们是...... 缺少。
请记住,Java数组是固定大小的,因此您无法使数组更长。您必须创建一个新的更长的数组并复制值。幸运的是,Java库有一个名为Arrays.copyOf(int[] original, int newLength)
的方法。您甚至不必填充零,因为这是默认值。
因此,首先扫描结果数组tab
以获取最长行长,然后重新分配所有短行。
// Your code (unchanged, but reformatted a bit)
int[][] tab1 = { {1,2,3}, {1,2,3} };
int[][] tab2 = { {1,2}, {1,2} };
int[][] tab = new int[tab1.length + tab2.length][];
System.arraycopy(tab1, 0, tab, 0, tab1.length);
System.arraycopy(tab2, 0, tab, tab1.length, tab2.length);
// Extend short rows
int rowLen = 0;
for (int[] row : tab)
if (row.length > rowLen)
rowLen = row.length;
for (int i = 0; i < tab.length; i++)
if (tab[i].length < rowLen)
tab[i] = Arrays.copyOf(tab[i], rowLen);
// Print result
System.out.println(Arrays.deepToString(tab));
输出
[[1, 2, 3], [1, 2, 3], [1, 2, 0], [1, 2, 0]]
答案 2 :(得分:0)
让maxLength成为数组的最大值(lenth),现在所有ohers数组都用0填充它们,直到达到maxLength,
Ex:maxLenth = 3,你有一个长度为2的行的数组,那么你只需要在每行的末尾添加1个zeo。