Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在原子值的情况下从映射中删除键_Java_Dictionary_Concurrency_Atomic_Key Value - Fatal编程技术网

Java 在原子值的情况下从映射中删除键

Java 在原子值的情况下从映射中删除键,java,dictionary,concurrency,atomic,key-value,Java,Dictionary,Concurrency,Atomic,Key Value,我想从映射中删除键,以防键的值为零(0)我可以使用map.values().removeAll(Collections.singleton(0l))。 在我使用Map之前,它一直工作得很好,但现在我们将实现更改为Map现在它不会删除值为零的键,因为我使用原子变量作为值。 我尝试使用的小代码段:: Map<String, AtomicLong> atomicMap = new HashMap<String,AtomicLong>(); atomicMap.p

我想从映射中删除键,以防键的值为零(0)我可以使用
map.values().removeAll(Collections.singleton(0l))


在我使用
Map
之前,它一直工作得很好,但现在我们将实现更改为
Map
现在它不会删除值为零的键,因为我使用原子变量作为值。
我尝试使用的小代码段::

    Map<String, AtomicLong> atomicMap = new HashMap<String,AtomicLong>();
    atomicMap.put("Ron", new AtomicLong(0l));
    atomicMap.put("David", new AtomicLong(0l));
    atomicMap.put("Fredrick", new AtomicLong(0l));
    atomicMap.put("Gema", new AtomicLong(1l));
    atomicMap.put("Andrew", new AtomicLong(1l));    

    atomicMap.values().removeAll(Collections.singleton(new AtomicLong(0l)));

    System.out.println(atomicMap.toString());
Map atomicMap=newhashmap();
原子地图。放置(“Ron”,新的原子地图(0l));
原子地图。放置(“大卫”,新的原子地图(0l));
原子地图。放置(“Fredrick”,新原子地图(0l));
原子图。put(“Gema”,新原子长(1l));
原子地图(atomicMap.put)(“安德鲁”,新原子地图(1l));
atomicMap.values().removeAll(Collections.singleton(新的AtomicLong(0l));
System.out.println(atomicMap.toString());
输出为{br>
{Ron=0,Fredrick=0,Gema=1,Andrew=1,David=0}

如您所见,值为0的键未被删除。如果有人能提出一个解决方案,那将是非常有帮助的

谢谢。

如果您使用的是Java8,那么可以使用
removeIf
方法

atomicMap.values().removeIf(x -> x.get() == 0L);
// Prints {Gema=1, Andrew=1}

如果您使用的是Java8,那么可以使用
removeIf
方法

atomicMap.values().removeIf(x -> x.get() == 0L);
// Prints {Gema=1, Andrew=1}

AtomicLong
的两个实例永远不相等。如果查看
AtomicLong
,您会发现它从不重写
equal()
方法。看

您可以通过自己的自定义
AtomicLong
实现来克服这一问题,该实现实现了
equals()
,并使删除元素的策略起作用

public class MyAtomicLongExample {

    static class MyAtomicLong extends AtomicLong {

        private static final long serialVersionUID = -8694980851332228839L;

        public MyAtomicLong(long initialValue) {
            super(initialValue);
        }

        @Override
        public boolean equals(Object obj) {
            return obj instanceof MyAtomicLong && ((MyAtomicLong) obj).get() == get();
        }
    }

    public static void main(String[] args) {
        Map<String, MyAtomicLong> atomicMap = new HashMap<>();
        atomicMap.put("Ron", new MyAtomicLong(0l));
        atomicMap.put("David", new MyAtomicLong(0l));
        atomicMap.put("Fredrick", new MyAtomicLong(0l));
        atomicMap.put("Gema", new MyAtomicLong(1l));
        atomicMap.put("Andrew", new MyAtomicLong(1l));    

        atomicMap.values().removeAll(Collections.singleton(new MyAtomicLong(0l)));

        System.out.println(atomicMap);
    }

}
公共类MyAtomicLongExample{
静态类MyAtomicLong扩展了AtomicLong{
私有静态最终长serialVersionUID=-86949808581332228839L;
公共MyAtomicLong(长初始值){
超级(初始值);
}
@凌驾
公共布尔等于(对象obj){
返回MyAtomicLong的obj实例&((MyAtomicLong)obj.get()==get();
}
}
公共静态void main(字符串[]args){
Map atomicMap=新HashMap();
原子地图。放置(“Ron”,新的原子地图(0l));
原子地图。放置(“大卫”,新的MyAtomicLong(0l));
原子地图。放置(“Fredrick”,新MyAtomicLong(0l));
原子图。put(“Gema”,新的MyAtomicLong(1l));
原子地图。放置(“安德鲁”,新MyAtomicLong(1l));
atomicMap.values().removeAll(Collections.singleton(新的MyAtomicLong(0l));
System.out.println(原子地图);
}
}

这将打印
{Gema=1,Andrew=1}

AtomicLong
的两个实例永远不相等。如果查看
AtomicLong
,您会发现它从不重写
equal()
方法。看

您可以通过自己的自定义
AtomicLong
实现来克服这一问题,该实现实现了
equals()
,并使删除元素的策略起作用

public class MyAtomicLongExample {

    static class MyAtomicLong extends AtomicLong {

        private static final long serialVersionUID = -8694980851332228839L;

        public MyAtomicLong(long initialValue) {
            super(initialValue);
        }

        @Override
        public boolean equals(Object obj) {
            return obj instanceof MyAtomicLong && ((MyAtomicLong) obj).get() == get();
        }
    }

    public static void main(String[] args) {
        Map<String, MyAtomicLong> atomicMap = new HashMap<>();
        atomicMap.put("Ron", new MyAtomicLong(0l));
        atomicMap.put("David", new MyAtomicLong(0l));
        atomicMap.put("Fredrick", new MyAtomicLong(0l));
        atomicMap.put("Gema", new MyAtomicLong(1l));
        atomicMap.put("Andrew", new MyAtomicLong(1l));    

        atomicMap.values().removeAll(Collections.singleton(new MyAtomicLong(0l)));

        System.out.println(atomicMap);
    }

}
公共类MyAtomicLongExample{
静态类MyAtomicLong扩展了AtomicLong{
私有静态最终长serialVersionUID=-86949808581332228839L;
公共MyAtomicLong(长初始值){
超级(初始值);
}
@凌驾
公共布尔等于(对象obj){
返回MyAtomicLong的obj实例&((MyAtomicLong)obj.get()==get();
}
}
公共静态void main(字符串[]args){
Map atomicMap=新HashMap();
原子地图。放置(“Ron”,新的原子地图(0l));
原子地图。放置(“大卫”,新的MyAtomicLong(0l));
原子地图。放置(“Fredrick”,新MyAtomicLong(0l));
原子图。put(“Gema”,新的MyAtomicLong(1l));
原子地图。放置(“安德鲁”,新MyAtomicLong(1l));
atomicMap.values().removeAll(Collections.singleton(新的MyAtomicLong(0l));
System.out.println(原子地图);
}
}

这将打印
{Gema=1,Andrew=1}

如果您要计算,则在值为零时决定删除

if (atomicMap.compute("Andrew", (k, v) ->  v.decrementAndGet()) == 0) {

      atomicMap.remove("Andrew");
}

若你们想计算,那个么决定在值为零时删除

if (atomicMap.compute("Andrew", (k, v) ->  v.decrementAndGet()) == 0) {

      atomicMap.remove("Andrew");
}