Массив Java int[][] – итерация и поиск значения
Вопрос
У меня есть массив в виде '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.
Если ваш массив и хеш-таблица инкапсулированы в одном и том же классе, оставшаяся часть кода будет довольно проста для написания и будет намного чище.
Как правило, нет способа найти конкретные координаты определенного значения, кроме как путем просмотра массива и его поиска. Однако, если значения в массиве гарантированно являются уникальными (то есть каждое значение встречается только в одной ячейке), вы можете поддерживать отдельный массив в качестве индекса, в котором хранятся координаты каждого значения, проиндексированного значением.