PriorityQueue 的顺序不符合预期[重复]
Posted
技术标签:
【中文标题】PriorityQueue 的顺序不符合预期[重复]【英文标题】:Order of PriorityQueue not as expected [duplicate] 【发布时间】:2017-08-23 05:41:34 【问题描述】:我有这个测试:
@Test
public void testPrioQueue()
PriorityQueue<Map.Entry<String, Integer>> pq = new PriorityQueue<>((a, b) -> b.getValue() - a.getValue());
pq.add(new SimpleEntry<>("one", 1));
pq.add(new SimpleEntry<>("three", 3));
pq.add(new SimpleEntry<>("two", 2));
List<String> keys = pq.stream().map(e -> e.getKey()).collect(Collectors.toList());
assertEquals(Arrays.asList("three", "two", "one"), keys);
我希望 PriorityQueue 根据我的比较器排序:首先按最高值排序。相反,我得到了这个结果:
java.lang.AssertionError: expected:<[three, two, one]> but was:<[three, one, two]>
我的预期错了吗?
【问题讨论】:
【参考方案1】:我们来看看PriorityQueue
docs:
方法 iterator() 中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。
同样适用于Stream
实例。
如果您想创建一个Stream
实例,该实例将按优先级顺序遍历队列,您可以执行以下操作:
Stream.generate(queue::poll).limit(queue.size())
请记住,poll
ing 将从原始队列中删除元素。
【讨论】:
好奇投反对票。 你应该提到这消耗队列。也就是说,完成后,queue
将为空。
@JimMischel 当然,好主意:)以上是关于PriorityQueue 的顺序不符合预期[重复]的主要内容,如果未能解决你的问题,请参考以下文章
grep -l 在到 xargs 的管道上的行为不符合预期[重复]
使用 MIN() 和 GROUP BY [重复] 时,SQL SELECT 的行为不符合预期
带有指针值的 Go 通道在 for 循环中的行为不符合预期[重复]