hashMap в Java - PullRequest
       6

hashMap в Java

0 голосов
/ 21 февраля 2011

Я хочу сделать это: метод будет deleteLeafValue, где он получит значение объекта.Это будет искать все значения sub hashMap и очистить все элементы, где третье значение является значением объекта.

   public void put(K1 key1, K2 key2, V value)
{
    HashMap<K2, V> childMap = get(key2);
    if (childMap == null)
    {
        childMap = new HashMap<K2, V>();
        put(key1, childMap);
    }
    childMap.put(key2, value);
}

Как я могу сделать метод deleteLeafValue?

Ответы [ 2 ]

4 голосов
/ 21 февраля 2011

Вы имеете в виду?

public void remove(K1 key1, K2 key2) {
    Map<K2, V> childMap = get(key2);
    if (childMap != null) 
       childMap.remove(key2);
}

или

public void removeByValue(V value) {
    for(Map<K2, V> childMap : values())
       for(Iterator<V> valueIter = childMap.values(); valueIter.hasNext();)
           if(valueIter.next().equals(value))
               valueIter.remove();
}

Возможно, использование составного ключа будет проще

Map<String, String> extendedMap = new HashMap<String, String>();
extendedMap.put("Row1/Column1", "French");
extendedMap.put ("Row1/Column2", "English");
extendedMap.put ("Row1/Column3", "Spanish");
extendedMap.put ("Row2/Column1", "John");
extendedMap.put ("Row2/Column2", "Richard");
extendedMap.put ("Row3/Column3", "Cole");

extendedMap.remove("Row3/Column3");
1 голос
/ 21 февраля 2011

Не думаю, что вы должны расширять HashMap, вам нужно управлять существующей реализацией Map извне:

Добавить листья

public static <V, K1, K2> V put(final Map<K1, Map<K2, V>> outerMap,
    final K1 outerKey,
    final K2 innerKey,
    final V value){
    Map<K2, V> innerMap = outerMap.get(outerKey);
    if(innerMap == null){
        innerMap = new HashMap<K2, V>();
        innerMap.put(innerKey, value);
        outerMap.put(outerKey, innerMap);
        return null;
    }
    return innerMap.put(innerKey, value);
}

Удалить листья по значению

/** Returns the number of deletions that were made */
public static <V, K1, K2> int deleteLeafValues(
    final Map<K1, Map<K2, V>> outerMap,
    final V value){

    int deleted = 0;
    for(final Map<K2, V> innerMap : outerMap.values()){
        final Iterator<Entry<K2, V>> iterator =
            innerMap.entrySet().iterator();
        while(iterator.hasNext()){
            if(iterator.next().getValue().equals(value)){
                iterator.remove();
                deleted++;
            }
        }

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