Вводит в заблуждение, hashtable делает это легко.

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

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

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

 James Van Huis23 янв. 2009 г., 23:12
Если это домашнее задание, вы должны прояснить это (помимо использования тега домашнего задания).

Ответы на вопрос(7)

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

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

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

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

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

 Bill K23 янв. 2009 г., 22:24
Вводит в заблуждение, hashtable делает это легко.

что позволяет просматривать каждое значение, по одному за раз.

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

Решение Вопроса

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

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

 Jon Skeet23 янв. 2009 г., 21:56
О, хорошо тогда :) Теперь смотрите, как я не могу сделать это последовательно ...
 Jon Skeet23 янв. 2009 г., 22:00
@ Пол: нет. Фортран воздает должное первой версии этого ответа. Возможно, он этого не знал, но это, безусловно, правда.
 Paul Tomblin23 янв. 2009 г., 21:57
Но вне закона, если он это сделает, он не будет отдавать дань уважения Фортрану.
 Outlaw Programmer23 янв. 2009 г., 21:55
+1 для полноты, но я бы переименовал «i» и «j» в «row» и «col».
 Aaron Maenpaa23 янв. 2009 г., 22:02
@Outlaw ... кроме того, какое измерение является строками, а какое измерение - столбцами, полностью зависит от вашей интерпретации (map [row] [column] или map [column] [row]); однако, i, j, k, l, m ... всегда являются silly_array [i] [j] [k] [l] [m] .... Что, я полагаю, это то, что достиг Джон.

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

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

Снова это означает, что вы должны переместить свои процедуры поиска / просмотра также в класс. (Обратно)!

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

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

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

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

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

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

 Bill K23 янв. 2009 г., 22:22
Сохраните новое целое число (ix + iy * 1000) в качестве значения в вашей хэш-таблице. Если ваш индекс y может превысить 1000, используйте большее число - целые числа действительно большие. Чтобы вернуть его, используйте ix = val% 1000, iy = val / 1000.
 user5457923 янв. 2009 г., 21:56
@ Herms: он хочет найти координаты по значению. поэтому ключ должен быть значением ячейки. все станет сложнее, если несколько ячеек могут иметь одинаковое значение, но это все еще выполнимо
 Herms23 янв. 2009 г., 21:53
Вы можете сделать это с обычным хэш-картой. Вам просто нужно определить объект для использования в качестве ключа, в котором есть обе координаты.
 Outlaw Programmer23 янв. 2009 г., 22:02
Я думаю, что иметь другую структуру данных здесь, вероятно, плохая идея. Это может быть трудно держать их в синхронизации. Вероятно, лучше выполнить поиск по всей таблице, даже если это будет медленнее.

Ваш ответ на вопрос