PriorityQueue的顺序与预期不符

时间:2017-08-23 05:41:35

标签: java collections priority-queue

我有这个测试:

@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 个答案:

答案 0 :(得分:1)

让我们看看PriorityQueue docs

  

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

同样适用于Stream个实例。

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

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

请注意,poll将从原始队列中删除元素。