代码之家  ›  专栏  ›  技术社区  ›  Datta Kunde

从哈希表中删除键

  •  -3
  • Datta Kunde  · 技术社区  · 16 年前

    2 回复  |  直到 16 年前
        1
  •  6
  •   Jesper    16 年前

    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 哈希表 ).

        2
  •  10
  •   Community Mohan Dere    9 年前

    Map<K,V> map 用一个 Set<K> removedKeys

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

    K key 你看 removedKeys.contains(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}"
    

    另请参见

    • 有效Java第2版,第52条:通过对象的接口引用对象