在3个二维数组中查找类似的行

在Java中解决以下问题的最佳方法是什么? 有3个具有相同行数和列数的二维数组:

Array1: [1]: {1, 2, 3} [2]: {2, 2, 4} [3]: {1, 1, 1} Array2: [1]: {1, 2, 0} [2]: {1, 2, 3} [3]: {1, 0, 1} Array3: [1]: {1, 1, 1} [2]: {1, 2, 3} [3]: {1, 0, 1} 

我需要找出所有数组中存在的行的索引 。 在上面的例子中答案应该是: [1],[2],[2]

Array1 [1] :{1,2,3}

Array2: [2] :{1,2,3}

Array3: [2] :{1,2,3}

更新:有没有内置函数来做到这一点? 或者FOR循环是唯一的解决方案吗?

我会做以下事情:

  • 创建一个在数组中占用一行并实现hashcodeequals
  • 将前两个数组中的每一行(包含在上面的类中)插入两个HashMaps
  • 对于最后一个数组中的每一行,确定它们是否存在于HashMaps

编辑#2,意识到需要反转映射。

 private Map map(int[] array){ Map arrayMap = new HashMap<>(); for (int i; i map1 = map(array1); Map map2 = map(array2); for (int i=0; i 

AFAIK没有内置function。

您需要编写自己的函数来实现它(使用for循环)。

发布一些代码来显示你尝试了什么,如果它没有正常工作或优化。

检查此代码:

 ArrayList arr1 = new ArrayList(); arr1.add(new Integer[]{1,2,3}); arr1.add(new Integer[]{2,2,5}); arr1.add(new Integer[]{1,1,1}); ArrayList arr2 = new ArrayList(); arr2.add(new Integer[]{1,2,0}); arr2.add(new Integer[]{1,2,3}); arr2.add(new Integer[]{1,0,1}); ArrayList arr3 = new ArrayList(); arr3.add(new Integer[]{1,1,1}); arr3.add(new Integer[]{1,2,3}); arr3.add(new Integer[]{1,0,1}); for (int r = 0 ; r < arr1.length() ; r++) { for(int s = 0 ; s < arr2.length() ; s++){ for(int t = 0 ; t < arr3.length() ; t++){ if(Arrays.deepEquals(arr1.get(r), arr2.get(s))){ }else { continue; } if(Arrays.deepEquals(arr1.get(r), arr3.get(t))){ System.out.println(r + " " + s + " " +t);; } } } } 

首先,编写一个名为AreRowsEqual()的函数,它比较两行。 所以,现在,问题已被重述为Find similar elements in 3 arrays

其次,尝试根据先前的知识考虑一个与您已经知道的最接近的解决方案:要在两个数组中找到相等的元素,您需要一个双嵌套for循环。 那么,要在三个数组中找到相等的元素,你需要一个三重嵌套循环,对吗?

好吧,现在,把它作为一个坏的,坏的,坏的解决方案,因为它的时间复杂度是O(n ^ 3) 。 我们应该能够做得更好。

考虑一下:为了使一个元素在所有3个数组中相似,首先它必须在前两个中相似; 然后,它必须在接下来的两个中相似。 这种算法的复杂性类似于O(x * n) ,其中x是数组的数量。 好多了,对吧? (我无法确切地知道O()将是什么,帮助任何人?) 编辑:事实certificate它是O((n ^ 2)*(x-1)),这比O(n ^好很多) 3)当n> x –END EDIT这顺便说一下,你可以忘记严格的3数组的要求,只考虑一些x数组。

我写了一个方法,收到一个upvote,然后我意识到它不会工作,我删除它。 这是另一种尝试,我相信它会起作用:

创建一个二维整数数组。 我们称之为“矩阵”。 此矩阵将具有x列,行数将是第一个数组的行数。 (是的,即使您的数组具有不同的长度,这也会起作用。)此矩阵的单元格中的数字将匹配行索引。 因此,例如,在我描述的算法完成之后,矩阵中的一行{ 1, 3, 2 } 1,3,2 { 1, 3, 2 }将告诉我们第一个数组的第1行与第二个数组的第3行和第三个数组的第2行匹配。 我们将使用-1表示“不匹配”。

因此,矩阵的第一列需要使用第一个数组的所有行的索引进行初始化,即使用数字0, 1, 2, ... n ,其中n是第一个数组中元素的数量。

对于每个附加数组,按如下方式填充矩阵中的列:循环遍历矩阵中当前列的每一行,并按如下方式计算单元格:如果前一列的相应单元格为-1 ,则执行-1 over进入这个细胞。 否则,在当前数组中查找与前一个数组的相应行匹配的行,如果找到,则将其索引存储到此单元格中。 否则,在此单元格中存储-1。

对所有数组重复,即对矩阵中的所有列重复。 最后,匹配的行是矩阵的最后一列中没有-1的行。

如果你真的关心效率,你可以按照John B的建议去做,并编写一个名为Row的不可变类,它封装(包含对行的引用)并实现hashCode()equals() 。 这里的equals()可以使用Arrays.deepEquals() 。 在Arrays也可能有一些叫做deepHashCode()东西,否则你需要自己滚动。

  1. 编写一个接受两个参数的方法:要搜索的二维数组,一维数组行。 如果未找到匹配项,则返回-1,否则返回匹配行的索引。

  2. 对于第一个数组的每一行:2a。 调用从第一个数组和Array2传递行的方法。 2B。 如果2a返回> 0,则调用传递相同行和Array3的方法

  3. 如果2b返回> 0,则输出返回的索引。

检查Arrays.deepEquals()方法。 它会检查两个数组是否相等。