2014-12-08 3 views
3

У меня есть следующая система значений ключа (HashMap), где String будет таким же, как этот «2014/12/06».Java получает значения из LinkedHashMap с частью ключа

LinkedHashMap<String, Value> 

Таким образом, я могу получить элемент зная ключ, но то, что я ищу способ, чтобы получить список значения, какие ключевые матчи частично, я имею в виду, как я могу получить все значения от 2014 года.

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

спасибо.

+0

Если вам регулярно требуется доступ к элементам таким образом, то вы можете инвестировать в [MapFilter] (http://stackoverflow.com/questions/17813940/is-there-a-way-to-get- а-список-оф-определенных фильтрованной-ключей-внутри-свойства-файлов в-Ja/17814755 # 17814755). – OldCurmudgeon

ответ

5

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

  1. Используйте TreeMap, в котором отсортированные ключах, так что вы можете найти первую ключевое слово> = "2014/01/01" (с использованием map.getCeilingEntry("2014/01/01")) и переходите все ключи оттуда.

  2. Используйте иерархию карт - то есть Map<String,Map<String,Value>>. Ключом на внешней карте будет год. Ключом на внутренней карте будет полная дата.

+0

Иерархия карт - это действительно хорошее решение, спасибо. – Octal

0

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

0

Если вы только когда-нибудь хотите получать элементы с помощью первой части ключа, то вы хотите TreeMap, а не LinkedHashMap. A LinkedHashMap сортируется в соответствии с порядком размещения, который не подходит для этого, но TreeMap сортируется в соответствии с естественным заказом или Comparator, который вы поставляете. Это означает, что вы можете найти первую запись, которая начинается с 2014 эффективно (в режиме журнала), а затем итерации до тех пор, пока вы не перейдете к первому, который не соответствует.

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

0

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