我有这样的功能,我应该在引用中找到所有键,其值为null并删除它们。怎么做?
public static void garbageCollector(Map references){
if (references.containsValue(null) ==true){
????
}
提前致谢。
答案 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();
}
}