维护 Pairs 的 PriorityQueue,以便根据 Pair class 的两个字段对元素进行排序

Maintaining a PriorityQueue of Pairs such that it's elements are sorted based on the two fields of the Pair class

我有两个数组 X 和 Y,我将从中创建 对 X[i] 和 Y[i]。现在我想将它们添加到 priorityQueue 中,以便我可以在队列中当前可用的对中检索最大的对。从最大开始,我的意思是与最大 'X' 配对,如果有多个相等的更大 'X',则优先考虑 'Y'。 到目前为止,我已经尝试了 3 种方法,但其中 none 有效。

// 1] Using Lambda Operator
public static void main(String[] args)
{
    PriorityQueue<Pair> pTq = new PriorityQueue<>((x, y) -> (x.X == y.X) ? x.Y-y.Y : x.X-y.X);
    int[] X = {1, 6, 4, 9, 13, 13, 5, 20, 7, 6};
    int[] Y = {2, 9, 13, 4, 8, 1, 16, 7, 5, 5};
    for (int i=0; i<10; i++)
        pTq.add(new Pair(X[i] , Y[i]));
    System.out.println( pTq );
}
// 2] Using Custom Comparator
public static void main(String[] args)
{
    PriorityQueue<Pair> pTq = new PriorityQueue<Pair>(Comparator.comparing(Pair::getX).thenComparing(Pair::getY));

    int[] X = {1, 6, 4, 9, 13, 13, 5, 20, 7, 6};
    int[] Y = {2, 9, 13, 4, 8, 1, 16, 7, 5, 5};
    for (int i=0; i<10; i++)
        pTq.add(new Pair(X[i] , Y[i]));
    System.out.println( pTq );
}
// 3] Again Custom Comparator
public static void main(String[] args)
{
    PriorityQueue<Pair> pTq = new PriorityQueue<>(new Comparator<Pair>()
    {
        @Override
        public int compare(Pair a, Pair b)
        {
            return (a.X == b.X) ? a.Y-b.Y : a.X-b.X;
        }
    });
    int[] X = {1, 6, 4, 9, 13, 13, 5, 20, 7, 6};
    int[] Y = {2, 9, 13, 4, 8, 1, 16, 7, 5, 5};
    for (int i=0; i<10; i++)
        pTq.add(new Pair(X[i] , Y[i]));
    System.out.println( pTq );
}
// Pair Class for all of the above
class Pair
{
    int X, Y;
    Pair (int x, int y)
    {
        X = x;
        Y = y;
    }
    int getX(){return X;}
    int getY(){return Y;}
    public String toString()
    {
        return ("("+X+" , "+Y+")");
    }
}

Desired result: [(1 , 2), (4 , 13), (5 , 16), (6 , 5), (6 , 9), (7 , 5), (9 , 4), (13 , 1), (13 , 8), (20 , 7)]

Actual result: [(1 , 2), (6 , 5), (4 , 13), (7 , 5), (6 , 9), (13 , 1), (5 , 16), (20 , 7), (9 , 4), (13 , 8)]

我知道我想在这里实现的目标可以通过其他数据结构来完成,例如带有自定义比较器的对列表,但我想知道这里有什么错误或者我在这里遗漏了什么。谢谢。

您的优先队列中的元素已经按照正确的顺序排列。您被打印的顺序误导了 - 请参阅

如果你在循环中重复调用poll,你可以验证相同。