如何从hashmap中获取5个最高值?

我有一个Hashmap链接存储为键的zipcodes和作为值存储在hashmap中的填充。

hashmap包含大约33k个条目。

我试图从5个邮政编码中获取5个最高人口值,并打印出与5个最高人口相关联的5个邮政编码,但是我无法理解如何做到这一点的算法。

如果它只是一个,它很容易,但5限制给我一些麻烦。

我知道将5个值存储在一个int数组中,我有一个计数器来确定它们中何时存储了5个,但就是这样。

谢谢

int populatedCounter = 0; int[] populatedZip = new int[5]; it = zipCodePop.entrySet().iterator(); while (it.hasNext()) { Map.Entry pairs = (Map.Entry)it.next(); for (int i = 0; i < populatedZip.length; i++) { } } } 

将这样的集合的条目放入列表并对其进行排序是一种选择。 但33k元素是一个数字,其中排序的O(n * log(n))复杂性可能已经具有显着的性能影响。

一个apporach将是使用nr4bt已经提到的PriorityQueue(我回答时写了这个片段)。 它基本上将所有元素插入到PriorityQueue中,该PriorityQueue根据映射条目的值进行排序。

 import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.PriorityQueue; public class GreatestOfMap { public static void main(String[] args) { Map map = new HashMap(); map.put("zip000", 1234); map.put("zip001", 2345); map.put("zip002", 3456); map.put("zip003", 4567); map.put("zip004", 5678); map.put("zip005", 6789); map.put("zip006", 123); map.put("zip007", 234); map.put("zip008", 456); map.put("zip009", 567); map.put("zip010", 7890); map.put("zip011", 678); map.put("zip012", 789); map.put("zip013", 890); int n = 5; List> greatest = findGreatest(map, 5); System.out.println("Top "+n+" entries:"); for (Entry entry : greatest) { System.out.println(entry); } } private static > List> findGreatest(Map map, int n) { Comparator> comparator = new Comparator>() { @Override public int compare(Entry e0, Entry e1) { V v0 = e0.getValue(); V v1 = e1.getValue(); return v0.compareTo(v1); } }; PriorityQueue> highest = new PriorityQueue>(n, comparator); for (Entry entry : map.entrySet()) { highest.offer(entry); while (highest.size() > n) { highest.poll(); } } List> result = new ArrayList>(); while (highest.size() > 0) { result.add(highest.poll()); } return result; } } 

尝试使用标准方法并假设人口计数在HashMap存储为Integer

 List list = new ArrayList(zipCodePop.values()); Collections.sort(list, Collections.reverseOrder()); List top5 = list.subList(0, 5); 

PriorityQueue也会有所帮助,也是一个关于如何从列表中获得前k的好主题,您可以查看此链接

 PriorityQueue p = new PriorityQueue(5); int[] a = new int[]{3,5,10,1,23,42,66,1333,545,110}; for (int i : a){ p.add(i); if (p.size() > 5){ p.poll(); } } //output will be highest 5, [42, 66, 110, 1333, 545] 

你可以有O(n log(k))时间复杂度// k是你的最高值。

如果没有电脑,只用一张纸和一支铅笔,你会怎么做? 假装你有一堆索引卡上有数字,找到5个最高的数字是你的工作。 你会怎么做? 写下其他人可以遵循的步骤来实现目标,当你写完这些步骤时,你将有一个算法,你可以开始考虑用代码实现。

你说单个最大值很容易,所以就像你使用单个最大值一样,但要跟踪五个最大值。 这里有一组最大值可能会有所帮助。

public class CheckHighiestValue {public static void main(String … s){

  HashMap map = new HashMap(); map.put("first", 10000); map.put("second", 20000); map.put("third", 300); map.put("fourth", 800012); map.put("fifth", 5000); map.put("sixth", 30012); map.put("seventh", 1234); map.put("eighth", 45321); map.put("nineth", 5678); Set> set = map.entrySet(); List> list = new ArrayList>( set); Collections.sort(list, new Comparator>() { @Override public int compare(Entry o1, Entry o2) { return o2.getValue().compareTo(o1.getValue()); } }); System.out.println(list.subList(0, 5)); } 

}