2014-11-06 42 views
3

我有一个HashMap象下面这样:删除地图的顶部或底部的n个元素

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 

是否有任何功能哪里可以得到顶部3(KV1,KV2,KV3)或底部3(KV3,KV-4坦克,KV5)键值对?或者可以是我可以删除前n个或后n个元素的任何函数?

在此先感谢。

+1

使用'TreeMap'而不是'HashMap'。它有像firstKey,lastKey和subMap这样的方法可以帮助你。 – 2014-11-06 09:46:21

+0

取决于你的意思是顶部。插入顺序或自然排序顺序? – tom 2014-11-06 09:48:34

+0

哦,如果你的意思是插入顺序,那么你想要的类是'LinkedHashMap'。 – 2014-11-06 09:49:14

回答

0

使用SortedMap,比如TreeMap而不是HashMap。然后您可以按顺序遍历这些键。这使得可以找到并删除3个最小的密钥。通过查找并删除最后一个键三次来删除三个最大的键。

2

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

首先,它取决于你的意思是顶部。插入顺序或自然排序顺序?

A LinkedHashMap保留插入顺序。 A TreeMap以自然排序顺序维护其键。

如果它是有排序的地图,那么您可以使用Treemap.headMap(K key),tailMap()和subMap();

如果是插入顺序,那么你必须自己提取子图。 Guava在地图中提供了一个名为Maps.filterKeys的帮助程序,它允许您查看您传入的Predicate所映射的底层地图。如果您不想复制地图,只需以不同的方式查看它,这非常有用。当然,如果这是你想要的,或者推出你自己的更专业的案例,你总是可以复制结果地图。

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

1

您可以删除从地图n个元素不重复这样

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

哦,这是非常好的。如果你只能提到'm'是一个'LinkedHashMap',这将是正确的答案。 – 2014-11-06 10:06:24

+0

不工作...给indexoutofbound异常。 – Leo 2014-11-06 10:40:42

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()); 
    } 
相关问题