2009-10-15 2 views
1

Я создал много объектов Geodata (name, postalCode, lat, lon). Теперь я хочу поместить их в коллекцию для поиска различных записей позже.Поиск/Запросы в коллекциях (Java)

Все должно происходить objectOriented/in-memory, поэтому вам не нужна реляционная база данных.

Такой запрос выглядит следующим образом:

  • Найти широта и долгота по имени или плз
  • Найти объекты между LAT1, LAT2 и LON1, LON2

Что коллекция является лучшим выбором для такая «простая» структура данных?

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

Есть ли возможность написать такие запросы в базе данных key => value?

ответ

4

Вы можете использовать в базе данных.

Это хорошо, как реляционные базы данных хороши для реляционных запросов, как это .... :-)


Для самодельный чисто Java, вы можете использовать:

  1. Map, с наименованием в качестве ключа
  2. Map, с пзз как ключ
  3. List<List<"object">> с LAT для первого списка, LON для второго списка.
    Оба сортируются, поэтому для каждого вы можете искать значение с помощью двоичного поиска и эффективно возвращать интервал с subList.

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

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

Thread-safety не является проблемой для этих структур данных, так как ваш прецедент кажется доступным только для чтения. Если вам нужно изменить «объекты» в некотором случае, вы можете защитить только «объекты», а не структуры данных, используемые для поиска.

+0

Я хочу решить эту проблему с чистой java! Сортированные структуры кажутся приятными. Разве не лучше использовать дерево с плоскими объектами, отсортированными по компаратору с помощью lat/lon? Есть также более 100 000 записей, поэтому я не уверен, что для запроса потребуется меньше, чем миллисекунда. –

+1

@Martin - Некоторая реализация 'Map', такая как' HashMap', очень эффективна при поиске вещей, она может легко найти объект менее чем за миллисекунду, даже если ваша карта содержит более 100 000 записей. – Jesper

+0

Нет ли лучшего решения с составными клавишами и деревьями с использованием метода subSet? –