【问题标题】:Get 3 highest values from Map<String,String>从 Map<String,String> 获取 3 个最高值
【发布时间】:2011-05-17 11:56:12
【问题描述】:

我有一个Map&lt;String,String&gt;,其中包含“User1”、“43”等条目。现在我想要一个最高值的“前 3 名”。

使用Map&lt;String,Integer&gt; 会更容易,但由于技术限制,我只能以&lt;String,String&gt; 获取地图。

&lt;String,String&gt; 映射转换为&lt;String,Int&gt; 映射然后对其进行排序的最有效方法是什么?

【问题讨论】:

    标签: java sorting collections map


    【解决方案1】:

    您可以遍历 Map 的值(使用 Map.values()),将每个值转换为整数(使用 Integer.getInteger(String s)),并跟踪您看到的前 3 个值。

    或者,您可以按照上述方法进行操作,但不要跟踪前 3 个,而是创建一个 LinkedList 并将每个 Integer 插入到正确的位置(遍历 LinkedList,直到找到应该插入 Integer 的位置)。

    【讨论】:

      【解决方案2】:

      有几种方法:

      1. 创建 SortedMap,例如带有自定义 -anonymous- Comparator 的 TreeMap,它通过查找它在 compare() 方法调用中获得的键与原始映射中的值进行比较。
      2. 通过 addAll() 方法使用原始中的所有键/值条目填充它。
      3. 观看按值排序的地图。
      4. 抓住头部/尾部(取决于比较器的排序方式)

      同上:

      1. 使用上述自定义比较器创建键的 TreeSet...
      2. 使用原始地图的 keySet() 填充它。
      3. 抓住钥匙的头/尾组。
      4. 从原始映射中的这些键和值创建一个新映射...

      【讨论】:

        【解决方案3】:

        要将&lt;String, String&gt; 转换为&lt;String, Integer&gt;,您可以使用:

         Map<String, Integer> treemap = new HashMap<String, Integer>();
         for (Entry<String, String> entry : entries) {
             treemap.put(entry.getKey(), Integer.parseInt(entry.getValue()));
         }
        

        但是,您将不得不再次迭代 Map。如果您不需要整个地图,而只需要前 3 个,那么您可以简单地迭代条目并通过比较获得前三个。

        或者,如果您需要顶部元素和整个数据,您可以反转键和值并使用 TreeMap&lt;Integer, String&gt;Comparator

        【讨论】:

          【解决方案4】:

          您可以将值放入 List 并对其进行排序:

          ArrayList<Integer> highest = new ArrayList<Integer>();
          for (String value : map.values()) {
              highest.add(Integer.parseInt(value));
          }
          Collections.sort(highest);
          for(int i = highest.size() - 1; i >=0 && i > highest.size()-4; i--){
              System.out.println(highest.get(i));
          }
          

          如果地图非常大,最好遍历它并只选择 3 个最高值而不对整个列表进行排序。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-11-02
            • 1970-01-01
            • 2019-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-02-10
            相关资源
            最近更新 更多