2011-05-25 194 views
3

我有一个二维数组,我想找到一个更简单的方法来处理我的代码,以便它会发现,如果没有在列重复,然后更简单的方法是什么我有如下:JAVA - 如何在二维数组中的行和列中查找重复值?

for (int i=0; i < array.length; i++) { 
    for (int j=0; j < array.length; j++) { 
     for (int k=1; k < array.length; k++){ 
      if (array[j+k][i] == array[j][i]) { 
       if (array[j][i] != 0) { 
       return true; 
       } 
      } 
     } 
    } 
    } 
return false; 

编辑:只是指出了上述^^将无法正常工作,因为它会抛出一个不受限制的例外

这种方式有太多的循环,我肯定有一个更简单的方法来找到重复,而不是去通过这个大规模的循环过程。

这是一个正方形的二维数组,即。行=列的数组。

如果是这样,那么这种新方法如何工作 - 我如何操纵它以在行中查找重复值。

感谢您的帮助。

+0

不会阵列[J + k]的[I]扔OutOfBoundException对于k = j =长度-1? – amit 2011-05-25 09:39:44

+0

哦,当然会。感谢您指出,从未意识到这一点。谢谢。 – ron8 2011-05-25 09:42:00

+0

您的要求不够清楚。你想查找所有重复值的索引吗?你在哪里指定你要找的重复是什么?为什么你想知道这样的事情?我正在投票结束这个问题。 – duffymo 2011-05-25 09:50:30

回答

3

您可以使用HashSet来存储所有已经遇到的元素。应该是这样的:

static boolean noDupes(int[][] array) { 
    for (int i=0; i < array.length; i++) { 
     HashSet<Integer> set = new HashSet<Integer>(); 
     for (int j=0; j < array.length; j++) { 
      if (set.contains(array[j][i])) return false; 
      set.add(array[j][i]); 
     } 
    } 
    return true; 
} 


该溶液是O(长度^ 2)= O(n),其中n是矩阵总大小。我认为这对大O来说是理想的,因为你需要检查所有元素。如预期

+0

(*)editted:在if语句行中更改了混合索引,更改了数组[i] [j] - > array [j] [i] – amit 2011-05-25 09:55:43

+0

谢谢您的好意amit。 – ron8 2011-05-25 10:11:38

1
int[][] array = new int[3][5]; 

for (int i = 0; i < array.length; i++) // array initialization 
    for (int j = 0; j < array[i].length; j++) 
    array[i][j] = i*j; 

Map<Integer, Set<Point>> map = new HashMap<Integer, Set<Point>>(); 

for (int i = 0; i < array.length; i++) 
    for (int j = 0; j < array[i].length; j++) 
    if (map.containsKey(array[i][j])) 
     map.get(array[i][j]).add(new Point(i, j)); 
    else 
    { 
     Set<Point> set = new HashSet<Point>(); 
     set.add(new Point(i, j)); 
     map.put(array[i][j], set); 
    } 


for (Map.Entry<Integer, Set<Point>> entry : map.entrySet()) 
    if (entry.getValue().size() > 1) 
    { 
    System.out.println("value = " + entry.getKey()); 
    for (Point p : entry.getValue()) 
     System.out.println("coordinates = " + p); 
    System.out.println(); 
    } 

输出:

value = 0 
coordinates = java.awt.Point[x=0,y=3] 
coordinates = java.awt.Point[x=0,y=0] 
coordinates = java.awt.Point[x=2,y=0] 
coordinates = java.awt.Point[x=0,y=4] 
coordinates = java.awt.Point[x=0,y=2] 
coordinates = java.awt.Point[x=1,y=0] 
coordinates = java.awt.Point[x=0,y=1] 

value = 2 
coordinates = java.awt.Point[x=1,y=2] 
coordinates = java.awt.Point[x=2,y=1] 

value = 4 
coordinates = java.awt.Point[x=2,y=2] 
coordinates = java.awt.Point[x=1,y=4] 
0

查找重复的元素在给定的矩阵 - JAVA

static void findDuplicates(String[][] matrix) { 
    HashSet<String> uniqInp = new HashSet<String>(); 
    HashSet<String> allDup = new HashSet<String>(); 
    System.out.println("***** DUPLICATE ELEMENTS *****"); 

    for(int row=0;row<matrix.length;row++) 
    { 
     for(int col=0;col<matrix[0].length;col++) 
     { 
      if(uniqInp.add(matrix[row][col])) 
       //If not duplicate it will add 
       continue; 
      else { 
       // If Duplicate element found, it will come here 
       if(allDup.add(matrix[row][col])) 
       System.out.print(matrix[row][col]+" "); 
      } 
     } 
    } 
}