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】:

我们来看看PriorityQueuedocs:

方法 iterator() 中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。

同样适用于Stream 实例。

如果您想创建一个Stream 实例,该实例将按优先级顺序遍历队列,您可以执行以下操作:

Stream.generate(queue::poll).limit(queue.size())

请记住,polling 将从原始队列中删除元素。

【讨论】:

好奇投反对票。 你应该提到这消耗队列。也就是说,完成后,queue 将为空。 @JimMischel 当然,好主意:)

以上是关于PriorityQueue 的顺序不符合预期[重复]的主要内容,如果未能解决你的问题,请参考以下文章

C ++ bool行为不符合预期[重复]

grep -l 在到 xargs 的管道上的行为不符合预期[重复]

使用 MIN() 和 GROUP BY [重复] 时,SQL SELECT 的行为不符合预期

带有指针值的 Go 通道在 for 循环中的行为不符合预期[重复]

Java:PriorityQueue 从自定义比较器返回不正确的顺序? [复制]

Java 中的 PriorityQueue 无法按预期工作。具有较高优先级的对象被插入到队列的末尾