Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找地图中的前十个值_Java_Algorithm_Map - Fatal编程技术网

Java 查找地图中的前十个值

Java 查找地图中的前十个值,java,algorithm,map,Java,Algorithm,Map,假设我有一个TreeMap,其中objectsong有三个字符串字段和一个内部CompareTo方法。地图的键是歌词中独特的词,不是常见的词,如“她”、“这个”、“如果”或“开”。地图中有多个歌曲副本,因为一首歌曲平均有60个单词 为了获得额外的学分,教授让我们想出一个算法来找出地图上的前10个值。我没有及时解决这个问题,这就是为什么我要问这个问题 我要说的是,与有序数组或列表不同,您不能只按顺序获取顶级值。所以,我想: Create a PriorityQueue<Node> wi

假设我有一个
TreeMap
,其中objectsong有三个字符串字段和一个内部CompareTo方法。地图的键是歌词中独特的词,不是常见的词,如“她”、“这个”、“如果”或“开”。地图中有多个歌曲副本,因为一首歌曲平均有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最终将包含所有键值对,但最大的大小将位于顶部,我只能检索前十个


这似乎是一种非常迂回的方式,因为这个特定的映射有31000多个节点映射到637000多个值。有更好的方法吗?

我不确定您是否想要按键显示前10个元素,在这种情况下,Soldier.moth是正确的,您可以特别获得一个名为descendingMap的降序视图,然后对前10个元素进行迭代。但是,如果您想通过其他关系获得前10名,只需迭代elementSet并将当前的前10名存储在排序数据结构中,比如TreeSet根据大小指定一个比较器--不确定您的意思是什么,但您可能知道--对于每一个元素,如果它小于当前值,则替换最小的10名。通过对算法的简单修改,您可以使用firstKey获得最小值:

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个条目

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

我没有做额外的测试,因为节点内部已经有一个比较方法,用于在优先级队列中排序。此外,该算法在运行时也不算太差,因为我成功地将其设置为O(N)时间,总执行时间不超过45毫秒。比较测试是将优先级队列中的项目数保持在10或更少,并停止构建不在前十名中的节点对象。然而,在尝试任何优化之前测量性能是正确的,否则您将不知道优化的效果如何。由于数据集上的顺序循环,该算法在O(N)时间内运行得非常好。此部分的总执行时间为45毫秒。