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