我有这个测试:
@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]>
我的期望是错的吗?
答案 0 :(得分:1)
让我们看看PriorityQueue
docs:
方法iterator()中提供的迭代器不保证以任何特定顺序遍历优先级队列的元素。
同样适用于Stream
个实例。
如果要创建一个按优先级顺序遍历队列的Stream
实例,可以执行以下操作:
Stream.generate(queue::poll).limit(queue.size())
请注意,poll
将从原始队列中删除元素。