Как найти повторяющиеся значения в строках и столбцах в 2D-массиве? - PullRequest
3 голосов
/ 25 мая 2011

У меня есть 2D Array, и я хотел бы найти более простой способ манипулирования моим кодом, чтобы он обнаружил, если в столбце есть дубликат, и более простым способом, чем тот, который у меня есть ниже:

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;

РЕДАКТИРОВАТЬ: ВЗАИМОПРАВИЛЬНО УКАЗАНО НАД ВЫШЕ ^^ НЕ РАБОТАЕТ, КАК ЭТО БУДЕТ ВЫБРОСИТЬ, ИСКЛЮЧЕНИЕ ИЗ СЧЕТОВ

У этого пути слишком много циклов, и я уверен, что должен быть более простой способ найти дубликаты, чем проходить через этот массовый цикл.

Это для квадратного двумерного массива, т.е. массив со строками = столбцы.

Если это так, как может работать этот новый способ - и как я могу манипулировать им, чтобы он также работал, чтобы найти повторяющиеся значения в строках.

Спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 25 мая 2011

вы можете использовать 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 - общий размер матрицы.Я думаю, что он идеален с точки зрения большого О, потому что вам нужно проверить все элементы.

1 голос
/ 25 мая 2011
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 голосов
/ 02 августа 2017

Поиск дубликатов элементов в заданной матрице - 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]+" ");
            }
        }
    }
}
...