Эффективный способ удаления значений из объекта hashmap - PullRequest
1 голос
/ 15 января 2011

У меня в объекте HashMap есть ключ x-y-z с соответствующим значением test-test1-test2.

Map<String,String> map = new HashMap<String,String>(); 
map.put("x-y-z","test-test1-test2");
map.put("x1-y1-z1","test-test2-test3"); 

Теперь у меня есть массив входных строк, который содержит некоторую часть ключа:

String[] rem={"x","x1"}

На основе этого строкового массива я хочу удалить значения HashMap.

Кто-нибудь может дать эффективный подход к выполнению этой операции?

Ответы [ 3 ]

5 голосов
/ 15 января 2011
List remList = Arrays.asList(rem);
for (Iterator it = map.keySet().iterator(); it.hasNext();) {
    String key = (String) it.next();
    String[] tokens = key.split("-");
    for (int i = 0; i < tokens.length; i++) {
        String token = tokens[i];
        if (remList.contains(token)) {
            it.remove();
            break;
        }
     }
}

И обновленная версия с добавлением функциональности на основе вашего последнего комментария к этому ответу:

private static Map getMapWithDeletions(Map map, String[] rem) {
    Map pairs = new HashMap();
    for (int i = 0; i < rem.length; i++) {
        String keyValue = rem[i];
        String[] pair = keyValue.split("@", 2);
        if (pair.length == 2) {
            pairs.put(pair[0], pair[1]);
        }
    }
    Set remList = pairs.keySet();
    for (Iterator it = map.keySet().iterator(); it.hasNext();) {
        String key = (String) it.next();
        String[] tokens = key.split("-");
        for (int i = 0; i < tokens.length; i++) {
            String token = tokens[i];
            if (remList.contains(token)) {
                it.remove();
                pairs.remove(token);
                break;
            }
        }
    }
    map.putAll(pairs);
    return map;
}
2 голосов
/ 15 января 2011

Отредактировано на основании отредактированного вопроса.

Цикл по набору ключей hashmap. Когда вы найдете ключ, который начинается с x, вы ищете удалить его с карты.

Что-то вроде:

for(String[] key: map.keySet()){
   if(key.length>0 && x.equals(key[0])){
      map.remove(key);
    }
}
0 голосов
/ 15 января 2011

Предполагая, что я вас правильно понимаю, и вы хотите удалить с карты все, начиная с 'x-' и 'x1-' (но не с 'x1111-', даже если 'x1' является префиксом 'x1111')и эффективность важна, вы можете захотеть взглянуть на одну из реализаций NavigableMap, такую ​​как (например) TreeMap.

NavigableMaps хранят свои записи в порядке (по порядку естественного ключа, по умолчанию) и могут быть перебраны и найдены очень эффективно.

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

Итак:

NavigableMap<String,String> map = new TreeMap<String,String>(); 
// populate data
for (String prefixToDelete : rem) {
    // e.g. prefixToDelete = "x"
    String startOfRange = prefixToDelete + "-"; // e.g. x-
    String endOfRange = prefixToDelete + "`"; // e.g. x`; ` comes after - in sort order
    map.subMap(startOfRange, endOfRange).clear(); // MAGIC!
}

Предполагается, что ваша карта велика, .subMap() должно быть намного быстрее, чем итерация по каждой записи карты (поскольку TreeMap использует красно-черное дерево для быстрого поиска).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...