在地图中查找前十个值

时间:2010-11-10 00:38:54

标签: java algorithm map

假设我有TreeMap<String, Treeset<Song>>,其中对象Song有三个String字段和一个内部CompareTo方法。地图的键是歌词中不是常用词的唯一词,例如“她”,“the”,“if”或“on”。地图中有多个歌曲副本,因为平均有60个单词映射到一首歌曲。

为了获得额外的功劳,教授要求我们提出一种算法来查找地图中的前10个值。我没有及时解决问题,这就是我在这里问的原因。

我难倒的部分是,与有序数组或列表不同,你不能只是按顺序获取最高值。所以,我想到了:

Create a PriorityQueue<Node> with the Comparator sorting the Nodes based
on the Set size

iterate over the map
   for each map node
     create a Node object with the key-value pair
     insert Node into the queue

即使PriorityQueue最终会包含所有键值对,但顶部大小将位于顶部,我可以检索前十个。

这似乎是一种非常迂回的方式,因为这个特定的地图有31,000多个节点映射到超过637,000个值。还有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

对算法进行简单修改:

Create a PriorityQueue<Node> with the Comparator sorting the Nodes based
on the Set size

iterate over the map
  for each map node
    if value for node is larger than last entry in priority queue
      create a Node object with the key-value pair
      insert Node into the queue
      trim the queue to ten entries

完成后,优先级队列将只包含前10个条目。

答案 1 :(得分:0)

我不确定你是否想要按键排名前10位,在这种情况下,Soldier.moth是正确的,你可以专门获得一个调用descendingMap的降序视图,然后迭代前10个元素。但是如果你想通过其他关系获得前10名,只需遍历elementSet并将当前前10名存储在已排序的数据结构中,比如TreeSet根据大小指定比较器 - 不确定你的意思是什么大小但你可能知道 - - 如果每个元素小于当前元素,则替换10个中的最小元素。你用firstKey获得最小的