Java: поиск в массиве объектов, для 2 конкретных значений объекта - PullRequest
0 голосов
/ 07 ноября 2010

Я делаю проект на Java, который включает (x, y) координаты. Я создал класс Cell, который защищает целые числа X & Y; После инициализации я выполняю цикл for, который устанавливает массив ячеек путем умножения значений X & Y, заданных пользователем, скажем, если X = 10 и Y = 10, я создаю массив ячеек [100].

Однако, как я могу быстро найти массив, не выполняя цикл for и не проверяя каждое отдельное значение очень долго?

Скажем, я ищу объект, который содержит X = 5 & y = 3. Я знаю, что могу пройти через цикл for, ищущий объект со значениями x и y, но мне было интересно, есть ли способ выполнить бинарный поиск и найти «немного быстрее» объект [i], который содержит X = 5 и Y = 5.

Большое спасибо.

Ответы [ 3 ]

1 голос
/ 07 ноября 2010

Способ сделать это состоит в том, чтобы расположить объекты Cell в массиве таким образом, чтобы было простое сопоставление координаты X, Y с индексом Cell в массиве.

Например, давайте предположим, что X и Y идут от 1 до 10. Предположим, что мы затем расположим ячейки так:

array[0] = Cell(1, 1);
array[1] = Cell(1, 2);
...
array[9] = Cell(1, 10);
array[10] = Cell(2, 1);
array[11] = Cell(2, 2);
...
array[99] = Cell(10, 10);

Должно быть легко увидеть, что мы можем вычислить индекс ячейки (i, j) в массиве и извлечь ячейку следующим образом:

public Cell getCell(Cell[] array, int i, int j) {
    int index = (10 * (i - 1)) + (j - 1);
    return array[index];
}

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

Это можно тривиально изменить, чтобы иметь дело со случаями, когда:

  • константа 10 - это нечто другое
  • матрица не квадратная,
  • матрица имеет более двух измерений
  • индексы работают от 0 до N - 1 вместо 1 до N
  • 1022 * прочее *

Существуют и другие способы представления двумерных матриц в Java. Самый простой - просто использовать Cell[][] cells, который позволяет вам получить доступ к ячейкам как (например) cells[i-1][j-1]. Могут быть разработаны более сложные представления, которые используют меньше места, если матрица разрежена (то есть отсутствуют ячейки) за счет более сложного кода и более медленного времени доступа.

1 голос
/ 07 ноября 2010

Звучит так (если вы все равно хотите использовать бинарный поиск), вы устанавливаете элемент 0 в ячейку с помощью x = 0, y = 0; от 1 до x = 0, y = 1 и т. д. Если это так, вы должны быть в состоянии легко вычислить точный индекс данной ячейки:

// contains the Cell with x = desiredX, y = desiredY
yourArray[desiredX * X + desiredY];

Однако, если вы этим занимаетесь, проще всего сделать двумерный массив:

yourArray = new Cell[X][Y];
...
yourArray[desiredX][desiredY];
0 голосов
/ 07 ноября 2010

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

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