Массив Java int[][] – итерация и поиск значения

StackOverflow https://stackoverflow.com/questions/474451

  •  19-08-2019
  •  | 
  •  

Вопрос

У меня есть массив в виде 'int[][]', который представляет координаты небольшой сетки.Каждой координате присвоено собственное значение.например array[0][4] = 28......

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

Спасибо за любую помощь!

Это было полезно?

Решение

Вы можете выполнять итерацию либо с помощью циклов for, либо с помощью расширенных циклов for:

for (int row=0; row < grid.length; row++)
{
    for (int col=0; col < grid[row].length; col++)
    {
        int value = grid[row][col];
        // Do stuff
    }
}

или

// Note the different use of "row" as a variable name! This
// is the *whole* row, not the row *number*.
for (int[] row : grid)
{
    for (int value : row)
    {
         // Do stuff
    }
}

Первый вариант был бы самым простым решением вопроса «найти координаты» — просто проверьте правильность значения во внутреннем цикле.

Другие советы

для перебора значений используйте циклы:

 int[][] matrix   
 //...
 for(int row[] : matrix)
     for(int cell : row){
      //do something with cell
    }

для доступа к координатам, основанным на значении, вам понадобится какой-то двойной хэш-файл (посмотрите на java.util.HashMap), но я ничего не знаю, что делает это напрямую

Чтобы перебрать все элементы сетки, попробуйте это:

int grid[][] = new int[10][10];

for(int i = 0; i < grid.length(); ++i) {
    for(int j = 0; j < grid[i].length(); ++j) {
        // Do whatever with grid[i][j] here
    }
}

Если ваша сетка не отсортирована каким-либо образом, вы, вероятно, не добьетесь большего успеха, чем поиск методом перебора.

Для итерации, я думаю, что это будет что-то вроде этого (синтаксис может быть немного отключен, я некоторое время не имел дело с массивами в Java.):

int[][] grid;  // just assuming this is already assigned somewhere

for(int x = 0 ; x < grid.length ; x++) {
  int[] row = grid[x];
  for(int y = 0 ; y < row.length ; y++) {
    int value = row[y];
    // Here you have the value for grid[x][y] and can do what you need to with it
  }
}

Для поиска вам, вероятно, потребуется использовать его для итерации, а затем вернуться, как только вы его нашли.

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

Используйте вложенные циклы for для итерации по измерениям x и y, что позволяет просматривать каждое значение по одному.

Для ввода значения просто сделайте то же, что и выше, но ищите совпадение с запрошенным значением.

Вы будете счастливы, если заблокируете все эти коллекции внутри одного класса и никоим образом не открываете их.

Это также означает, что ваши процедуры поиска и поиска также будут перенесены в этот класс.

Для хранения, все охвачены итерациями, добавьте хеш-таблицу и поиск. Я добавил этот комментарий к посту Николая:

Сохраните новое целое число (ix + iy * 1000) в качестве значения в вашей хэш-таблице. Если ваш индекс y может превысить 1000, используйте большее число - целые числа действительно большие. Чтобы вернуть его, используйте ix = val% 1000, iy = val / 1000.

Если ваш массив и хеш-таблица инкапсулированы в одном и том же классе, оставшаяся часть кода будет довольно проста для написания и будет намного чище.

Как правило, нет способа найти конкретные координаты определенного значения, кроме как путем просмотра массива и его поиска. Однако, если значения в массиве гарантированно являются уникальными (то есть каждое значение встречается только в одной ячейке), вы можете поддерживать отдельный массив в качестве индекса, в котором хранятся координаты каждого значения, проиндексированного значением.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top