繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM