删除Map中一组条目的最佳方法

时间:2017-09-06 12:17:36

标签: java

是否有任何快速可靠的方法/方法可以根据条目值的属性删除一组条目。下面的方法循环每个不合需要的条目。 例如: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();
        }
    }

2 个答案:

答案 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

Guava

给你另一个