为什么PriorityQueue无法正常工作?

时间:2016-02-22 14:13:03

标签: java priority-queue

这是我的代码:

public static List<int[]> getSkyline(int[][] buildings) {
    List<int[]> res = new ArrayList<>();

    PriorityQueue<int[]> heights = new PriorityQueue<>(buildings.length * 2, new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
            if (o1[0] == o2[0]) {
                return o1[1] - o2[1];
            } else {
                return o1[0] - o2[0];
            }
        }
    });

    for (int[] h : buildings) {
        heights.add(new int[]{h[0], -h[2]});
        heights.add(new int[]{h[1], h[2]});
    }


    for (int[] height : heights) {
        System.out.println(Arrays.toString(height));
    }

    return res;
}

public static void main(String[] args) {
    getSkyline(new int[][]{{0, 2, 3}, {2, 5, 3}});

}

在我的想法中,由于输入为new int[][]{{0, 2, 3}, {2, 5, 3}},因此输出应为[0, -3][2, -3][2, 3][5, 3],但实际上显示为[0, -3][2, 3][2, -3][5, 3]。谁能告诉我我的代码有什么问题?提前谢谢。

1 个答案:

答案 0 :(得分:1)

原因是PriorityQueue<T>在迭代时没有对元素进行排序:

public Iterator<E> iterator()的文档说明了方法

  

返回此队列中元素的迭代器。迭代器不会以任何特定顺序返回元素。

要获得您期望的排序,您需要逐个从优先级队列中删除元素,然后打印它们:

while (heights.size() != 0) {
    int[] height = heights.poll();
    System.out.println(Arrays.toString(height));
}

此更改产生以下输出:

[0, -3]
[2, -3]
[2, 3]
[5, 3]

Demo.