是否有任何快速可靠的方法/方法可以根据条目值的属性删除一组条目。下面的方法循环每个不合需要的条目。 例如: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();
}
}
答案 0 :(得分:0)
没有更好的方法可以在不使用其他数据结构的情况下改变地图。你基本上要求的是像数据库中使用的二级索引,你可以根据一些非主键属性指向条目。如果您不想存储额外的索引,则没有更简单的方法来遍历所有条目。
我建议您研究的是在原始地图上构建地图视图。例如(使用番石榴)
Map<String,POJO> smallerMap = Maps.filterValues(map,
v -> !attribute.equalsIgnoreCase(v.getAttribute())
);
您需要小心这样的视图(例如,不要在它上面调用size()),但是对于访问等,它应该没问题(取决于您的确切需求,内存限制等)。
并注意 - 请注意我已删除null检查值。你不能在ConcurrentHashMap中存储空值 - 它在普通地图中也不是一个好主意,最好删除整个键。
答案 1 :(得分:0)
我能想到两种解决方案
第一个解决方案:
创建另一个映射,用于将对象哈希码存储为键,将相应的键存储为值。结构可能如下所示
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。
给你另一个