В настоящее время я использую HashMap<String, Integer>
, который заполнен ключами типа String
, которые имеют длину, скажем, 5 символов. Как я могу найти конкретный ключ из 4 символов или меньше, который является частью и в начале некоторых других ключей, и получить все попадания в виде набора <Key, Value>
?
HashMap‹String, Integer› Искать часть ключа?
Ответы (8)
Итерация — ваш единственный вариант, если вы не создаете пользовательскую структуру данных:
for (Entry<String, Integer> e : map.entrySet()) {
if (e.getKey().startsWith("xxxx")) {
//add to my result list
}
}
Если вам нужно что-то более эффективное по времени, вам понадобится реализация карты, в которой вы отслеживаете эти частичные ключи.
Похоже на вариант использования TreeMap
, а не HashMap
. Разница в том, что TreeMap сохраняет порядок. Так вы сможете найти частичное совпадение гораздо быстрее. Вам не нужно проходить всю карту.
Проверьте этот вопрос Частичный поиск в HashMap
Вы не можете сделать это через HashMap
, вы должны написать свою собственную реализацию для Map
для реализации поиска по длине строки на карте.
Map
может быть расширением (extends
) реализации HashMap
или других существующих реализаций, переопределять только то, что требуется. Моя точка зрения заключалась в том, что для этого вопроса Map
кажется правильной структурой данных, но с некоторыми измененными get
(для поиска на основе длины) и помещенными (для оптимального получения повторите O(1)
). Поскольку все остальные ответы показывают внешнюю логику в качестве решения, наличие определенного Map
приведет к инкапсуляции этой логики внутри самой карты.
- person harsh; 21.05.2013
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
.
Set<Entry<String, Integer>> s1 = map.entrySet();
for (Entry<String, Integer> entry : s1) {
if(entry.getKey().length == 4)
//add it to a map;
}
Сначала установите запись в свою хэш-карту. Переберите набор и проверьте длину каждого ключа и добавьте его на карту или используйте его по своему усмотрению.
С помощью HashMap<String, Integer>
вы можете пройти только keySet()
и выполнить contains()
для String
клавиш и вашего паттерна.
Как уже отмечалось, не существует очень эффективного* способа сделать это с указанной вами структурой данных. Однако, если вы добавите дополнительный Map<Integer, List<String>>
для отслеживания сопоставления длины строки со списком всех ключей с этой длиной, вы сможете сделать это очень эффективно.
*Используя только Map‹String, Integer›, вам нужно будет выполнить итерацию по всей емкости большей карты, тогда как добавление этой дополнительной структуры данных потребует поиска O (1) (при условии, что вы использовали HashMap), за которым следует итерация только через набор результатов, который является самым быстрым результатом.
Вы можете попробовать этот подход:
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;
}
getKey.length()
и добавить или нет (в зависимости от условия) кList<>
- person Javier Diaz   schedule 21.05.2013keySet()
? - person vikingsteve   schedule 21.05.2013Trie
. - person Thomas Jungblut   schedule 21.05.2013