从Map <string,string> </string,string>中获取3个最高值

时间:2010-11-29 20:13:39

标签: java sorting collections map

我有Map<String,String>,其条目如“User1”,“43”。现在我想要一个最高值的“前三名”。

使用Map<String,Integer>会更容易,但由于技术限制,我可以将地图作为<String,String>抓取。

<String,String>地图转换为<String,Int>地图然后对其进行排序的最有效方法是什么?

4 个答案:

答案 0 :(得分:3)

要从<String, String>转换为<String, Integer>,您可以使用:

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

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

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

答案 1 :(得分:1)

有几种方法:

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

    1. 使用上面的自定义比较器创建一个KeySet树组...
    2. 使用原始地图的keySet()填充它。
    3. 抓住钥匙的头/尾套装。
    4. 从这些键创建一个新地图,并从原始地图中创建值...

答案 2 :(得分:1)

您可以将值放在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个最高值而不对整个列表进行排序。

答案 3 :(得分:0)

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

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