关于Java:如何遍历PriorityQueue?

您所在的位置:网站首页 pq循环 关于Java:如何遍历PriorityQueue?

关于Java:如何遍历PriorityQueue?

2024-07-16 03:53:52| 来源: 网络整理| 查看: 265

1for (Event e : pq)

不按照优先级顺序进行迭代。

123while(!pq.isEmpty()){   Event e = pq.poll(); }

这可以工作,但可以清空队列。

相关讨论 那如何排空队列? peek()不会删除元素。 peek()不应删除对象 peek()继续返回头部 while循环中的逻辑没有意义。 isEmpty不像hasNext。 有类似的问题。使用委派和package器概念进行修复stackoverflow.com/a/51968633/1465553

来自Javadocs

The Iterator provided in method iterator() is not guaranteed to traverse the elements of the PriorityQueue in any particular order. If you need ordered traversal, consider using Arrays.sort(pq.toArray()).

可能还有其他等效的机制。

相关讨论 这个答案将从一个例子中受益。据我所知,Arrays.sort(pq.toArray())并没有执行任何操作。首先必须创建一个包含PriorityQueue元素的数组,然后可以使用Arrays.sort(theActualArray, pq.comparer())对该数组进行排序。 @Madmenyo 1.这个答案确实有一个例子。 2. Arrays.sort()不执行任何操作。 3.没有PriorityQueue.comparer()这样的方法。 但是,这种使用在计算上非常繁琐。出于学术目的,id喜欢补充一点,使用它遍历排序优先级所花费的时间为n * n * log(n);其中第一个N是遍历队列的时间,而N * log(N)用于排序。

由于底层实现,您不能以此顺序遍历Priority Queue(我认为这是Java的最小堆)。

它不是排序数组,因此您可以从一个元素转到优先级较低的元素。

偷看(读取堆中顶部的元素堆)是恒定时间O(1),因为它看起来是最小的元素。

要获取第二个下一个元素,您必须使最小的top元素出队,这就是它的工作方式。 出队(重新堆砌= O(log n)时间)不仅是取出该元素的问题,底层结构还会重新排列自身,以优先处理优先级最低的元素。

此外,要遍历整个优先级队列以按排序顺序读取所有项目,这是一个O(n log(n))操作。 因此,您也可以只获取队列中的所有元素并对其进行排序(也为O(n log (n))),然后可以根据需要遍历它们。唯一的缺点是您要保留队列的额外副本。

尽管如此,如果您需要以这种方式遍历数据,优先级队列可能不是您所需要的正确数据结构。

相关讨论 那么PriorityQueue几乎没有用吗? 根本没有,它对于它的实际作用非常有用,并且经过了很好的优化。创建它比完全排序的数据结构(线性vs O(n log n))要快,但是您仍然可以在恒定时间内找到min / max,并在log n中找到入队/出队。如果您需要按顺序对所有元素进行迭代,那么这根本不是正确的数据结构。 公平,尽管我会说它有相当有限的/特定的用途。 @Qix并非总是迭代是一个错误的设计; OP希望对所有元素进行迭代,但是有时我需要从优先级队列中找到与某些谓词匹配的第一个元素。然后,对10k数组进行排序以获取前10个元素之一效率很低(尤其是在循环中完成时)

基于堆的优先级队列仅保证第一个元素是最高/最低。没有便宜的(即O(n))方法来获取排序形式的元素。

如果您需要经常执行此操作,请考虑使用一种将元素保留为排序形式的结构。例如,使用java.util.TreeSet,然后使用pollFirst()或pollLast()代替peek() / poll()

以前的海报说的一切,但没有人提供完整的工作示例(除了复制pq),所以这里是:

12345Event[] events = pq.toArray(new Event[pq.size()]); Arrays.sort(events, pq.comparator()); for (Event e : events) {     System.out.println(e); }

您可以复制队列并进行循环轮询,在此示例中,pq是原始优先级队列:

123456PriorityQueue pqCopy = new PriorityQueue(pq); while(!pqCopy.isEmpty()){     Your_Class obj = pqCopy.poll();     // obj is the next ordered item in the queue     ..... }

因此,将priorityQueue放入列表中,然后对其进行排序是一个不错的选择,如上所述。以下是迭代器为何产生意外结果的一些详细信息:

迭代器未按正确的顺序返回元素,因为它从基础数据结构(类似于ArrayList)进行打印。 ArrayList中存储的数据的方式与将数据存储在BinaryHeap的Array实现中的方式相同。例如:

1234PriorityQueue pq = new PriorityQueue(); ArrayList test = new ArrayList(Arrays.asList(6,12,7,9,2)); test.forEach(x -> pq.add(x)); System.out.println("Priority Queue:-"+pq); [2, 6, 7, 12, 9]

其中childOf(i)是2 * i 1和2 * i 2且parentOf(i)是(i-1)/ 2

最近,我遇到了同样的问题。我想使用优先级队列中的某些特定对象,然后保留其余元素。

1)我创建了一个newPriorityQueue。 2)使用Iterator解析oldQueue中的每个元素 3)使用oldQueue.poll()方法检索元素 4)将元素3)插入newPriorityQueue(如果未使用)。

1234567891011 Queue newQueue = new PriorityQueue();     // Assuming that oldQueue have some data in it.     Iterator itr = oldQueue.iterator();     while(itr.hasNext()){         String str = oldQueue.poll();         // do some processing with str         if(strNotUsed){             newQueue.offer(str);         }     }

最后,oldQueue将为空。 @其他:-如果我可以做同样的事情,请提出一种更好的方法。我不能使用迭代器,因为它没有以正确的顺序返回元素。

peek()方法不会从队列中删除任何内容,但是由于这个原因,它将连续获得最高值,直到它为空。 我猜测您在while循环后检查了它是否为空,这将为您提供这个结论。

执行此操作的唯一方法是自己对它进行排序。 您可以像这样获得原始的比较器:

1234Event[] events = Arrays.sort(pq.toArray(), pq.comparator()); for (Event e : events) {     // do stuff } 相关讨论 这与OP的原始示例相同。 从那以后,我了解到该示例不是最佳途径。使用comparator,不需要将队列转换为数组。 for (Event e : pq) {应该可以完成这项工作。 Arrays.sort是否返回东西?我认为它返回void。我收到错误:Found void, expect ....。 当然,这不是唯一的方法。例如,他可以创建另一个PQ。

123for (Event event: pq.toArray(new Event[pq.size()])) {     event.toString(); } 相关讨论 请修改您的答案以包含一些说明。纯代码的答案对教育未来的SO读者几乎没有作用。您的答案在质量不高的审核队列中。 您的代码不能解决问题。数组应在迭代之前进行排序。



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭