从哈希表中删除键

Dat*_*nde -3 java

我想在不使用remove函数的情况下从哈希表中删除键.所以给我一些想法.

pol*_*nts 10

您可以通过补充一个模拟删除键Map<K,V> mapSet<K> removedKeys.

要删除一个key,只是removedKeys.add(key);.

无论什么时候K key被查询,你都会看到removedKeys.contains(key).如果确实如此,则key实际上已被"移除" map.

请注意,这是一种非常奇特的处理方式,并且保持两个结构同步可能会导致后来的麻烦.如果removedKeys是本地化的和短暂的,例如当你在Map使用的条目上进行迭代for-each并希望稍后删除某些键时,它会更容易接受,同时避免使用ConcurrentModificationException.

所以你可能有这样的事情:

static void removeEvenKeys(Map<Integer,String> map) {
    Set<Integer> removedKeys = new HashSet<Integer>();
    for (Map.Entry<Integer,String> entry : map.entrySet()) {
        if (entry.getKey() %2 == 0) {
            removedKeys.add(entry.getKey());
        }
    }
    map.keySet().removeAll(removedKeys);        
}
Run Code Online (Sandbox Code Playgroud)

其他地方:

    Map<Integer,String> map = new HashMap<Integer,String>();
    map.put(1, "One");
    map.put(2, "Two");
    map.put(3, "Three");
    map.put(4, "Four");

    removeEvenKeys(map);
    System.out.println(map);
    // "{1=One, 3=Three}"
Run Code Online (Sandbox Code Playgroud)

也可以看看

  • Effective Java 2nd Edition,Item 52:通过接口引用对象

相关问题


Jes*_*per 6

您可以拨打remove()Iterator的,而不是Hashtable本身:

Hashtable<String, String> map = new Hashtable<String, String>();
map.put("one", "een");
map.put("two", "twee");
map.put("three", "drie");

for (Iterator<Map.Entry<String, String>> i = map.entrySet().iterator(); i.hasNext(); ) {
    Map.Entry<String, String> entry = i.next();

    if ("two".equals(entry.getKey())) {
        // Removes entry from Hashtable; note, this is not the Hashtable.remove() method
        // but the Iterator.remove() method
        i.remove();
    }
}

System.out.println(map);
Run Code Online (Sandbox Code Playgroud)

(注意:您应该使用HashMap而不是遗留的集合类Hashtable).