我必须找到两个多维且锯齿状的数组之间的共同元素,并且仅将它们打印一次。我编写了一些代码并获得了输出,但它打印了数组 1 和数组 2 中的所有公共(public)元素,它只需打印一次。 我的意思是如果数组 1 是 [5, 5,3] 数组 2 是 [5, 5, 6,2] 输出是 [5, 5, 5,5]。我只需打印 5 一次。
这里我已经停止多次打印数组 2 中的重复元素,因为我插入了 boolean 标签。 但无法从数组 1 停止。例如,必须 1 次获取 5 个元素并检查它在数组 2 中是否可用,如果存在,则打印 5 作为输出。
int[][] arr1 = new int[][]{{1, 2, 1}, {9, 7, 2}, {7, 3, 6}};
int[][] arr2 = new int[][]{{2, 6, 8}, {0, 1, 7}, {7, 2, 0}, {8, 3}};
System.out.println("Input 1:");
for (int i = 0; i < arr1.length; i++) {
System.out.println(Arrays.toString(arr1[i]));
}
System.out.println("Input 2:");
for (int j = 0; j < arr2.length; j++) {
System.out.println(Arrays.toString(arr2[j]));
}
boolean duplicate = false;
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
int transpose = 0;
transpose = arr1[i][j];
for (int k = 0; k < arr2.length; k++) {
duplicate = false;
for (int l = 0; l < arr2[k].length; l++) {
if (transpose == arr2[k][l]) {
System.out.println(transpose);
duplicate = true;
break;
}
}
if (duplicate) break;
}
}
}
最佳答案
让我们创建一个集合来确定是否已找到某个项目。
这将是一个存储迄今为止找到的常见数字的集合。现在,让我们循环数组:
Set<Integer> found = new HashSet<Integer>();
//Looping the rows of the first array
for (int outer1 = 0; outer1 < arr1.length; outer1++) {
//Looping the cells of the first array's current element
for (int inner = 0; inner < arr1[outer1].length; inner++) {
//Looping the rows of the second array
for (int outer2 = 0; outer2 < arr2.length; outer2++) {
if (found.contains(arr1[outer1][inner])) continue;
//Is arr1[outer1][inner] a common item?
if (ArrayUtils.indexOf(arr2[outer2], arr1[outer1][inner]) >= 0)
//If so, have we found it already?
if (!found.contains(arr1[outer1][inner])) {
//No, this is the first time we find this particular common item
//So we add it
found.add(arr1[outer1][inner]);
//And print it
System.out.println(arr1[outer1][inner]);
//Let's force moving forward:
outer2 = arr2.length;
}
}
}
}
}
因此我们:
- 循环第一个数组
- 循环第一个数组当前项的项
- 循环第二个数组
- 检查第一个数组的当前内部项是否在第二个数组的当前数组内
- 如果是,我们检查它是否是新的
- 如果是这样,我们会将其添加到集合中,这样我们就不会再次打印它
- 并打印
- 如果是,我们检查它是否是新的
- 检查第一个数组的当前内部项是否在第二个数组的当前数组内
- 循环第二个数组
- 循环第一个数组当前项的项
编辑:
正如 @Eritrean 在评论部分指出的那样,Java 没有用于数组的名为 indexOf
的方法,并且代码的初始版本无法编译。因此,我使用 ArrayUtils
的 indexOf
来编辑上面的代码 ( https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/ArrayUtils.html#indexOf-boolean:A-boolean- )
如果不想使用它,他/她可以实现一个 indexOf
方法,该方法将返回数组中某个项目的索引,如果未找到则返回 -1,或者循环内部数组也是第二个数组。
关于java - 我必须找到两个数组多维和锯齿状数组之间的共同元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77280103/