Должен ли я использовать 2D ArrayList или HashMap для представления матрицы расстояний? - PullRequest
0 голосов
/ 28 марта 2019

Мое приложение считывает список местоположений из XML-файла, сохраняя их как Location объекты:

public class Location {
  private int id;
  private double latitude;
  private double longitude;
}

Созданные объекты будут сохранены в ArrayList<Location> locationList. Размер используемых входных файлов может варьироваться, но для примера файла, который я тестирую, есть более 200 мест. После того, как приложение выполнит синтаксический анализ файла, новое местоположение не будет добавлено до конца сеанса времени выполнения.

Я хочу создать матрицу прямых расстояний между всеми точками. Направление не имеет значения: расстояние от А до В и наоборот всегда будет одинаковым. Какие из следующих коллекций больше подходят для представления вышеуказанной информации:

  • ArrayList<ArrayList<Double>>
  • HashMap<Integer, HashMap<Integer, Double>>

, где два вышеупомянутых символа используют Location.id в качестве индекса / ключа или

  • HashMap<Location, HashMap<Location, Double>>

, где в качестве ключа используется сам объект Location.

Приложение обращается к матрице, вызывая метод distanceOf(int locationIdA, int locationIdB).

* * * * * * * * ArrayList кажется наиболее распространенной реализацией из-за своей простоты, но она кажется неэффективной? distanceOf(A, B) всегда будет таким же, как distanceOf(B, A), а distanceOf(A, A) всегда будет 0.

Учитывая вышесказанное, я думаю, я всегда могу добавить несколько строк кода примерно так:

public double distanceOf(int idA, int idB) {
  double dist = 0;

  if (idA != idB) {
    // dist = idA < idB ? matrix[idA][idB] : matrix[idB][idA];
  }

  return dist;
}

Благодаря тому, что первый id, переданный в матрицу, всегда меньше, возможно, использование HashMap более эффективно сейчас, но так ли это на самом деле? Есть ли другие соображения?

Какую из трех коллекций мне следует использовать?

...