Коллекции Java - Эффективный поиск диапазонов DateTime - PullRequest
2 голосов
/ 12 апреля 2011

У меня есть случай, когда у меня есть таблица (t1), которая содержит такие элементы, как

 | id | timestamp | att1 | att2 |

Теперь мне нужно перебрать коллекцию элементов типа att1 и получить все записи из t1, которые находятся междудве определенные временные метки для этого att1.Я должен сделать эту операцию несколько раз для одного att1.

Поэтому, чтобы упростить запросы к базе данных, я намеревался загрузить каждую запись из t1, которая имеет определенный атрибут att1, один раз в коллекцию и выполнитьпоследующие поиски в этой коллекции.

Существует ли коллекция, которая может обрабатывать поиск, например , между «2011-02-06 09:00:00» и «2011-02-06 09:00»:30' ?Не обязательно содержать записи для этих двух временных отметок.

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

Спасибо!

Ответы [ 3 ]

11 голосов
/ 12 апреля 2011

Да.Используйте TreeMap , который в основном представляет собой отсортированную карту пар ключ => значение и его метод TreeMap :: subMap (fromKey, toKey) .

В вашем случае вы быиспользуйте метки времени в качестве ключей для карты и для значений att1 атрибут или id или что-либо еще, что будет наиболее удобным для вас.

1 голос
/ 12 апреля 2011

Самое близкое, о чем я могу подумать, и это не совсем то, что я бы посчитал идеальным, - это написать компаратор, который будет сортировать даты так, чтобы те, кто находится в пределах диапазона, считали меньше, чем те, которые находятся вне диапазона (всегда возвращают -1 при сравнении in с out, 0 при сравнении in с in или out с out и всегда возвращать +1 при сравнении out с in.

Затем используйте этот компаратор для сортировки коллекции (я предлагаю ArrayList). Значения в пределах диапазона появятся первыми.

Возможно, вам лучше написать собственный фильтр. Введите коллекцию (я рекомендую LinkedList), переберите ее и удалите все, что не входит в диапазон. Сохраняйте мастер-копию, чтобы при необходимости создавать новые для передачи в фильтр.

0 голосов
/ 12 апреля 2011

Вы можете создать нужный объект в своей коллекции, который, как мне кажется, att1, реализовать интерфейс Comparable, а затем с помощью метода CompareTo сравнить поле метки времени. С этим он будет работать в любой отсортированной коллекции, такой как treeSet, что упрощает итерацию и извлечение всего в определенном диапазоне.

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