[英]Best approach to delete a set of entries in a Map
是否有任何快速,可靠的方法/方法根据条目值上的属性删除一组条目。 下面的方法循环每个不希望的条目。 例如:ConcurrentHashMap-条目将以百万计
Iterator<Map.Entry<String, POJO>> iterator = map.entrySet().iterator();
for (Iterator<Map.Entry<String, POJO>> it = iterator; it.hasNext(); ) {
Map.Entry<String, POJO> entry = it.next();
POJO value = entry.getValue();
if (value != null && *attribute*.equalsIgnoreCase(value.getAttribute())) {
it.remove();
}
}
没有利用其他数据结构,就没有更好的方法来改变地图。 您基本上要提供的是二级索引,就像数据库中使用的那样,在二级索引中您具有基于某些非主键属性的条目的指针。 如果您不想存储额外的索引,那么没有一种简单的方法可以遍历所有条目。
我建议您研究的是在原始地图上组成地图视图。 例如类似(使用番石榴)
Map<String,POJO> smallerMap = Maps.filterValues(map,
v -> !attribute.equalsIgnoreCase(v.getAttribute())
);
您将需要谨慎使用这种视图(例如,不要在其上调用size()),但是对于访问等来说应该没问题(取决于您的确切需求,内存限制等)。
和旁注-请注意,我已删除了空值检查。 您不能在ConcurrentHashMap中存储空值-在法线贴图中也不是一个好主意,最好删除整个键。
我可以想到两种解决方案
第一个解决方案:
创建另一个映射,以将对象哈希码存储为键,并将相应的键存储为值。 结构可能如下所示
Map<Integer, String> map2 = new HashMap<>();
这是有效的解决方案。 如果存在大量对象,这样做的唯一缺点就是很难获得唯一的哈希码。
import java.util.HashMap;
import java.util.Map;
public class DualHashMap {
public static void main(String a[]){
Map<String, Pojo> map = new HashMap<>();
Map<Integer, String> map2 = new HashMap<>();
Pojo object1 = new Pojo();
Pojo object2 = new Pojo();
map.put( "key1", object1);
map.put( "key2", object2);
map2.put(object1.hashCode(), "key1");
map2.put(object2.hashCode(), "key2");
// Now let say you have to delete object1 you can do as follow
map.remove(map2.get(object1.hashCode()));
}
}
class Pojo{
@Override
public int hashCode(){
return super.hashCode(); //You must work on this yourself, and make sure hashcode is unique for each object
}
}
第二解决方案:
使用Guava或Apache为双重哈希图提供的解决方案
您需要的Apache Commons类是BidiMap 。
这是番石榴为您准备的另一种
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.