我应该在HashMap中搜索具有values = null的所有键并删除它们。我怎样才能做到这一点?

时间:2014-03-26 13:52:05

标签: java hashmap

我有这样的功能,我应该在引用中找到所有键,其值为null并删除它们。怎么做?

public static void garbageCollector(Map references){
            if (references.containsValue(null) ==true){
                ????
            }

提前致谢。

8 个答案:

答案 0 :(得分:3)

您可以使用迭代器:

public static void garbageCollector(Map references){
    Iterator iterator = references.entrySet().iterator();
    while (iterator.hasNext()) {
        Map.Entry pair = (Map.Entry)iterator.next();
        if (pair.getValue() == null) {
            iterator.remove(); // avoids a ConcurrentModificationException
        }
    }
 }

在Java 8中,您可以创建一个新的Map,其中删除了空条目:

references.entrySet().stream().filter(p -> p.getValue() != null).collect(toMap(Entry::getKey, Entry::getValue));

答案 1 :(得分:3)

references.values().removeAll(Collections.singleton(null));

这应该只是为你做的工作:)

答案 2 :(得分:2)

我已根据您的要求准备了演示。你可以查看这个

public static void main(String args[]) {
    Map map = new HashMap();
    map.put(1, null);
    map.put(2, "val1");
    System.out.println("map is "+map);
    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
         Map.Entry entry = (Map.Entry) it.next();
            Integer key = (Integer)entry.getKey();
            String value = (String)entry.getValue();
            if (value == null) 
                it.remove();

    }
    System.out.println("map is "+map);
}

答案 3 :(得分:1)

查看以下代码示例:

public <K, V> static void garbageCollector(Map<K, V> map) {
    Collection<K> remove = new LinkedList<K>();
    for (Entry<K, V> e : map.entrySet()) {
        if (e.getValue() == null) {
            remove.add(e.getKey());
        }
    }
    for (K r : remove)  {
      map.remove(r);
    }
}

这只是执行此操作的几种方法之一。

答案 4 :(得分:0)

循环键,获取每个键的值 如果该值为null,请删除该键。

public static void garbageCollector(Map references){
    ArrayList lst = new ArrayList();
    for (Object k : references.keySet()){
        if (references.get(k)==null){
            lst.add(k);
        }
    }
    for (Object k : lst){
        references.remove(k);
    }
}

答案 5 :(得分:0)

Map<String, Object> m = new HashMap<String, Object>();
LinkedList<String> toRemove = new LinkedList<String>();
for (Entry<String, Object> e : m.entrySet()) {
    if (e.getValue() == null) {
        toRemove.add(e.getKey());
    }
}
for (String key : toRemove) {
    m.remove(key);
}

答案 6 :(得分:0)

使用entrySet()。规范说

  

集合由地图支持,因此对地图的更改会反映在集合中,反之亦然。

因此,您可以使用条目而不是地图编辑集合,这样更容易。

    HashMap<Object, Object> map = new HashMap();
    System.out.println("before");
    map.put(1, 2);
    map.put(2, null);
    map.put(3, null);

    for (Map.Entry<Object, Object> e : map.entrySet()) {
        System.out.println(e.getKey() + "=" + e.getValue());
    }

    for (Iterator<Map.Entry<Object, Object>> i = map.entrySet().iterator(); i.hasNext();) {
        if (i.next().getValue() == null) {
            i.remove();
        }
    }

    System.out.println("\nafter");
    for (Map.Entry<Object, Object> e : map.entrySet()) {
        System.out.println(e.getKey() + "=" + e.getValue());
    }

输出:

before
1=2
2=null
3=null

after
1=2

答案 7 :(得分:-2)

你可以写成:

Iterator<Map.Entry<String,String>> iter = map.entrySet().iterator();
    while (iter.hasNext()) {
        Map.Entry<String,String> entry = iter.next();
        if(null == (entry.getValue())){
            iter.remove();
        }
    }