【问题标题】:Delete top or bottom n elements of a map删除地图的顶部或底部 n 个元素
【发布时间】:2014-11-06 09:43:13
【问题描述】:

我有一个如下所示的 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

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

提前致谢。

【问题讨论】:

  • 使用TreeMap 而不是HashMap。它有 firstKeylastKeysubMap 等方法,它们会帮助你。
  • 取决于您所说的顶部。插入顺序还是自然排序?
  • 哦,如果你的意思是插入顺序,那么你想要的类是LinkedHashMap
  • 是的,我的意思是广告订单。
  • 那么你必须使用 LinkedHashMap,而不是 HashMap

标签: java map hashmap


【解决方案1】:

您可以通过这种方式从地图中删除 n 个元素而无需迭代

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

【讨论】:

  • 哦,这非常好。如果你只能提到mLinkedHashMap,这就是正确的答案。
【解决方案2】:

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

首先,这取决于您所说的顶部是什么意思。插入顺序还是自然排序?

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

如果是排序映射,则可以使用Treemap.headMap(K key)、tailMap() 和subMap() 请求键的视图;

如果是插入顺序,那么您必须自己提取子图。 Guava 在 Maps 中提供了一个名为 Maps.filterKeys 的助手,它允许您查看由您传入的 Predicate 过滤的底层地图。如果您不想复制地图,这很有用,只需以不同的方式查看即可。当然,如果您愿意,您可以随时复制生成的地图,或者推出您自己的更专业的案例。

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

【讨论】:

    【解决方案3】:

    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());
        }
    

    【讨论】:

      【解决方案4】:

      也许这可以用于在列表末尾跳过 n 个元素,这里的限制是 (n-m),其中 m 是要在列表底部跳过的元素数

      items.entrySet().stream()
                .limit(limit)
                .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll );
      

      或者你可以使用skip忽略地图开头的元素,这里的skipElements是你想在列表开头跳过的元素个数,

      items.entrySet().stream()
                    .skip(skipElements)
                    .collect(LinkedHashMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll );
      

      我还没有测试过。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 2012-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多