java - 我必须找到两个数组多维和锯齿状数组之间的共同元素

标签 java arrays multidimensional-array duplicates

我必须找到两个多维且锯齿状的数组之间的共同元素,并且仅将它们打印一次。我编写了一些代码并获得了输出,但它打印了数组 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 的方法,并且代码的初始版本无法编译。因此,我使用 ArrayUtilsindexOf 来编辑上面的代码 ( 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/

相关文章:

javascript - 循环遍历数组以创建二维数组 - 循环不起作用?

java - 由于缺少执行数据文件 :/var/lib/jenkins/workspace/soapuiauto1/hdap-project/tar‌​get/jacoco. exec 而跳过 JaCoCo 执行

Java文档状态模式?

javascript - jQuery - 根据先前的选择动态选择数组

javascript - 如何使我的搜索栏在 React Native 中正常工作?

java - 基于 Shrinking Sliding Window/2D array 拆分字符串

java - 按每行的平均值对二维数组进行排序

ruby - 遍历 Ruby 中的二维数组

JavaScript WebSocket : Cant connect to localhost

java - RestEasy Web 服务无法使用指定的 URL 获取响应?