删除地图的顶部或底部n个元素

时间:2014-11-06 09:43:13

标签: java map hashmap

我有一个如下的HashMap:

map.put("1","One");    \\KV1
map.put("3","Three");  \\KV2
map.put("2","Two");    \\KV3
map.put("5","Five");   \\KV4
map.put("4","Four");   \\KV5

是否有任何功能我可以获得前三名(KV1,KV2,KV3)或底部3(KV3,KV4,KV5)键值对?或者可以是我可以删除前n个或后n个元素的任何函数?

提前致谢。

4 个答案:

答案 0 :(得分:3)

您可以在没有迭代的情况下从地图中删除n个元素

map.keySet().removeAll(Arrays.asList(map.keySet().toArray()).subList(0, 5));

答案 1 :(得分:2)

这个问题有一些可怕的答案。

首先,它取决于你的意思。广告订单或自然排序订单?

LinkedHashMap保留了广告订单。 TreeMap按自然排序顺序维护其键。

如果它是已排序的地图,那么您可以使用Treemap.headMap(K key),tailMap()和subMap()请求查看密钥;

如果是它的插入顺序,那么您必须自己提取子图。 Guava在地图中提供了一个名为Maps.filterKeys的帮助程序,它允许您查看由传入的谓词所覆盖的基础地图。如果您不想复制地图,只需查看不同的地图即可。当然,您可以随时复制生成的地图,如果这是您想要的,或者推广您自己更专业的案例。

This question shows how to write a generic subMap method for LinkedHashMaps.

答案 2 :(得分:0)

使用SortedMap,例如TreeMap而不是HashMap。然后,您可以按顺序遍历键。这使得查找和删除3个最小的键成为可能。通过查找并删除最后一个键三次删除三个最大的键。

答案 3 :(得分:0)

LinkedHashMap维护map中条目的链接列表,按照插入顺序排列。

    Map<String,String> map = new LinkedHashMap<String, String>();
    map.put("1","One");    //KV1
    map.put("3","Three");  //KV2
    map.put("2","Two");    //KV3
    map.put("5","Five");   //KV4
    map.put("4","Four");   //KV5

    for(Map.Entry<String, String> mapentry : map.entrySet() ){
        System.out.println(mapentry.getKey()); // you can get the keys and values 
        System.out.println(mapentry.getValue());
    }