HashMap <String, Integer> Искать часть ключа?

В настоящее время я использую HashMap<String, Integer>, который заполняется ключами типа String, которые все, скажем, длиной 5 символов. Как я могу найти конкретный ключ из 4 символов или меньше, который является частью и в начале некоторых других клавиш и получает все образы в виде коллекции <Key, Value>?

Ответ 1

Iterate - ваш единственный вариант, если вы не создадите собственную структуру данных:

for (Entry<String, Integer> e : map.entrySet()) {
    if (e.getKey().startsWith("xxxx")) {
        //add to my result list
    }
}

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

Ответ 2

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

Ответ 3

Похоже, что используется для TreeMap, а не HashMap. Разница в том, что TreeMap сохраняет порядок. Таким образом, вы можете найти свое частичное совпадение намного быстрее. Вам не нужно проходить всю карту.

Проверьте этот вопрос Частичный поиск в HashMap

Ответ 4

Map<String, Integer> result = new HashMap<String, Integer>;
for(String key : yourMap.keySet()) {
    if(key.length() == 4){
        result.put(key, yourMap.get(key);
    }
}

После выполнения этого кода у вас есть все пары ключ/значение с 4-буквенными клавишами в result.

Ответ 5

Например:

public static void checkMap(Map mp) {
    Iterator it = mp.entrySet().iterator();
    while (it.hasNext()) {
        Map.Entry pairs = (Map.Entry)it.next();
        System.out.println(pairs.getKey().toLowerCase().contains("YourString"))
        }
}

Этот код напечатает true для тех keys, которые содержат ваш substring.

Ответ 6

Set<Entry<String, Integer>> s1 = map.entrySet();
    for (Entry<String, Integer> entry : s1) {
          if(entry.getKey().length == 4)
          //add it to a map;
}

Сначала введите запись в свой хэш файл. Перейдите через набор и проверьте длину каждой клавиши и добавьте ее на карту или используйте ее как хотите.

Ответ 7

С HashMap<String, Integer> вы можете пройти только keySet() и сделать contains() для String и вашего шаблона.

Ответ 8

Как уже отмечалось, нет невероятно эффективного * способа сделать это с указанной вами структурой данных. Однако, если вы добавите дополнительный Map<Integer, List<String>>, чтобы отслеживать отображение из длины строки в список всех ключей с этой длиной, вы сможете сделать это очень эффективно.

* Используя только Map < String, Integer > , вам нужно будет выполнять итерацию по всей емкости большей карты, тогда как добавление этой дополнительной структуры данных приведет к поиску O (1) (если вы используете HashMap), а затем итерации через только результат, который является самым быстрым возможным результатом.

Ответ 9

Вы можете попробовать этот подход:

public Map<String,Integer> filterMap(Map<String, Integer> inputMap){
    Map<String, Integer> resultHashMap = new HashMap<String, Integer>();
        for (String key : inputMap.keySet()) {
            if(key.length()==5){
                resultHashMap.put(key,inputMap.get(key));
            }   
        }
        return resultHashMap;
    }