2010-11-29 62 views
0

我有一个Map<String,String>,它有像“User1”,“43”这样的条目。现在我想要一个最高值的“前三名”。从地图<字符串,字符串>获取3个最高值

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

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

回答

0

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

或者,您可以像上面那样做,但不是跟踪前3个,做一个LinkedList并在正确的位置插入每个Integer(遍历LinkedList,直到找到Integer应该插入的位置)。

1

有几种方法:

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

与上述相类似:

  1. 创建如上一个自定义比较键的一个TreeSet ...
  2. 填充它与您的原始地图的keySet()。
  3. 抓住钥匙的头部/尾部组。
  4. 创建从原始地图这些密钥和值的新地图...
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())); 
} 

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

或者,如果您同时需要顶部元素和全部数据,则可以反转键和值并将TreeMap<Integer, String>Comparator一起使用。

1

你可以只把值的列表,并对其进行排序,如果这张图是非常大的可能会更好来遍历它,并只选择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)); 
} 

相关问题