2015-10-07 2 views
3

У меня есть HashMap (String, Object). Ключ представляет собой комбинацию из более чем одного уникального идентификатора. У меня есть вход, строка, которая является частью ключа (1 уникальный идентификатор). Мне нужно принять значение в HashMap, используя ту часть ключа, которая у меня есть, без повторения тысяч значений в HashMap.Получить значение HashMap с помощью части ключа

Можно ли достичь этого, используя любой оператор Regex в HashMap.get()?

Мой ключ - xxx.yyy.zzz, где комбинация xxx.zzz уникальна на всей карте. У меня есть xxx и zzz в качестве входных данных. Также у меня есть набор возможных значений yyy (5-6 возможностей, которые могут также увеличиться) для заданного zzz.

У меня есть два варианта решить это сейчас.

  1. Map.Entry, чтобы проверить, является ли ключевым начинается и заканчивается ххх и ZZZ соответственно
  2. методом проб и ошибок я. Введите ключ xxx.yyy.zzz со всеми возможными yyys и проверьте, присутствует или нет ключ .contains() ii. Но так, если я делаю .contains() 5-6 раз для каждого вызова, не будет ли он проходить через 5-6 раз в худшем случае? iii. Также я создаю больше строк в stringpool.

Кому хотелось бы?

+0

HashMap не работает для извлечения частей ключа. Вы должны соответствовать ему точно для поиска. – Thilo

+0

, который содержит все ответы здесь? Не стреляйте в посланника. HashMap просто не делает этого ... – Thilo

+0

насколько велик ваш набор данных и как часто вам нужно его запрашивать? Линейный поиск через «тысячи» ключей, вероятно, не слишком страшный. «сотни тысяч» могут вызвать у вас неприятности. – Thilo

ответ

0

Можем ли мы достичь его с помощью любого Regex заявление в HashMap.get()?

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

В качестве альтернативы, вы должны подтвердить имена ключей ober и получить соответствующие значения. Они могут иметь регулярное выражение для соответствия вашей входной строке с ключом.

3

Единственный способ получить значение из HashMap без итерации по записям/ключам (которые вам не нужны) - это поиск полного ключа.

Если вам требуется эффективный поиск с помощью частичного ключа, вы должны рассмотреть вопрос о наличии HashMap, чей ключ - это частичный ключ.

+0

Это будет мульти-карта. Или, возможно, вложенная Карта («Карта >») – Thilo

+0

@Thilo Или отдельная карта для частичных ключей или же карта, содержащая несколько ключей для одного и того же значения (как полные, так и частичные). – Eran

+0

Я предложил 2 решения. Можете ли вы помочь мне найти лучшего? –

3

Нет, нельзя использовать частичные ключи с HashMap.

С TreeMap это может быть достигнуто с помощью частичного префикса требуемого ключа, так как он позволяет вам использовать tailMap(String key), чтобы вернуть часть карты, которая будет следовать определенному ключу (т. Е. Вашей ключевой части). Вам все равно нужно обработать записи, чтобы увидеть, какие из них будут соответствовать частичному ключу.

+0

TreeMap - хороший выбор для поиска в префиксах (по-прежнему не работает для произвольных шаблонов). – Thilo

+0

@Thilo Ah, вы правы, у него ID1 ID2 ID3 ... – Kayaman

+0

Если он это делает, ему нужно что-то вроде индекса ключевого слова Lucene. – Thilo

0

Вы не можете сделать это, используя HashMap. Тем не менее, вы можете использовать TreeMap, который будет хранить ключи в соответствии с их естественным порядком. Вы можете написать собственный метод поиска, который найдет соответствующий ключ, если он существует, в наборе с использованием регулярного выражения. Если правильно писать, это займет O(lgN) времени, что существенно лучше, чем линейное. Проблема сводится к поиску String в упорядоченном списке String.

Как заметил @Thilo, это решение предполагает, что вы пытаетесь сопоставить фрагмент ключа, который начинается в начале, а не где-либо еще.

+1

.. если вы хотите найти префикс, да. Не работает, если у вас есть ключи, структурированные как «id1, id2, id3» (всего один ключ) и хотите, чтобы все с «id2». – Thilo

1

Если ваши ключи похожи на xxx.yyy.zzz, и вы хотите использовать тип доступа xxx.*, то вы можете рассмотреть мой класс MapFilter.

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

0

HashMap работает над алгоритмом хеширования, который поддерживает хэш-коды хэш-кода ключей и на основе хэш-кода хэш-кода получает соответствующее значение. Для этого вам необходимо переопределить equals() и hashcode() метод для пользовательских объектов.

Так

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

  2. Если вы не указали точное соответствие ключа, как HashMap обнаружит это ведро с неправильным хэш-кодом?

Смежные вопросы