从哈希表中删除键

时间:2010-07-15 11:56:28

标签: java

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

2 个答案:

答案 0 :(得分:10)

您可以通过使用Map<K,V> map补充Set<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);        
}

然后在其他地方:

    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}"

另见

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

相关问题

答案 1 :(得分: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);

(注意:您应该使用HashMap代替旧版集合类Hashtable。)