我有一个Map<String,String>
,它有像“User1”,“43”这样的条目。现在我想要一个最高值的“前三名”。从地图<字符串,字符串>获取3个最高值
使用Map<String,Integer>
会更容易一些,但是由于技术上的限制,我可以将该地图作为<String,String>
来抓取。
将<String,String>
地图转换为<String,Int>
地图然后对其进行排序的最有效方法是什么?
我有一个Map<String,String>
,它有像“User1”,“43”这样的条目。现在我想要一个最高值的“前三名”。从地图<字符串,字符串>获取3个最高值
使用Map<String,Integer>
会更容易一些,但是由于技术上的限制,我可以将该地图作为<String,String>
来抓取。
将<String,String>
地图转换为<String,Int>
地图然后对其进行排序的最有效方法是什么?
您可以遍历Map的值(使用Map.values()),将每个值转换为Integer(使用Integer.getInteger(String s)),并跟踪您看到的前3个。
或者,您可以像上面那样做,但不是跟踪前3个,做一个LinkedList并在正确的位置插入每个Integer(遍历LinkedList,直到找到Integer应该插入的位置)。
有几种方法:
与上述相类似:
从<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()));
}
但是,那么你将不得不遍历地图再次。如果你不需要整个地图,而只需要前3名,那么你可以简单地迭代条目,并通过比较获得前三名。
或者,如果您同时需要顶部元素和全部数据,则可以反转键和值并将TreeMap<Integer, String>
与Comparator
一起使用。
你可以只把值的列表,并对其进行排序,如果这张图是非常大的可能会更好来遍历它,并只选择3种最高值,而无需进行排序整个名单
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));
}
。