Java int [] [] массив - итерация и поиск значения - PullRequest
7 голосов
/ 23 января 2009

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

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

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

Ответы [ 7 ]

23 голосов
/ 23 января 2009

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

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
    }
}

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

3 голосов
/ 23 января 2009

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

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

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

2 голосов
/ 23 января 2009

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

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
    }
}
1 голос
/ 23 января 2009

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

Для итерации, я думаю, что это будет что-то вроде этого (синтаксис может быть немного отключен, я некоторое время не имел дело с массивами в 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
  }
}

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

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

0 голосов
/ 24 января 2009

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

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

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

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

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

0 голосов
/ 23 января 2009

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

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

0 голосов
/ 23 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...