假设我们通过对凤凰新闻日志的清理获取到一亿条新闻的URL地址,现在需要统计出一亿条新闻URL中最热门的五十条新闻URL(这些新闻URL重复度比较高,虽然总数是一亿,如果去重之后,大约有三千万条新闻URL,URL去重过程不需要考虑,一条新闻URL的重复度越高,说明阅读该新闻的用户越多,也就是越热门,每条新闻URL长度限制不超过255字节),要求使用的内存不超过8G,请写出基本思路与步骤。(该题不计入试卷得分,有时间则完成)
//伪代码 String url; HashMap<String, Integer> map = new HashMap<String, Integer>(); while (fileStream.hasNext()){ url = read(); if (map.containsKey(url)){ map.get(url)++; }else{ map.put(url, 1); } }
PriorityQueue<Map.Entry<String, Integer>> queue = new PriorityQueue<Map.Entry<String, Integer>>(50, new Comparator<Map.Entry<String, Integer>>(){ @Override public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) { return o1.getValue() - o2.getValue(); } }); int k = 50; for (Map.Entry<String, Integer> entry : map.entrySet()){ if (queue.size() < k){ queue.add(entry); } else { if (entry.getValue() > queue.peek().getValue()){ queue.poll(); queue.add(entry); } } }