Java 具有 ArrayLists 和 Pairs 的优先级队列

Java Priority Queue with ArrayLists and Pairs

我正在寻找在 Java 中构建优先级队列的简单方法。我构建了一个 ArrayList<Pair>,每个 Pair 实例包含一个 XY 值。

class Pair {
    private final Float xVal;
    private final Float yVal;

    public Pair(Float aXVal, Float aYVal) {
        xVal = aXVal;
        yVal = aYVal;
    }

    public float getX() {
        return xVal;
    }

    public float getY() {
        return yVal;
    }
}

我的 ArrayList 看起来像:

ArrayList<Pair> listOfPoints;

使用ArrayList listOfPoints,我想建立两个优先级队列:

我正在寻找一种使用 Lambda 表达式执行此操作的简单方法。

我确实查看了 Stack Overflow 上的 this 问题,我发现了这段代码:

PriorityQueue<String> pq=
                    new PriorityQueue<String>(5,(a,b) -> a.length() - b.length());

我认为这接近我想要的。

我正在尝试执行以下操作:

PriorityQueue<Pair> xSorted = new PriorityQueue<Pair>(numOfPoints, (x1,x2) -> Need Help Here);

如何访问 Pair 以便比较 x1x2

请注意,我将 nummberOfPoints 设置为 ArrayList<Pair> listOfPoints 的长度。

对于基于xVal的自然(升序)顺序:

PriorityQueue<Pair> pq= new PriorityQueue<>(Comparator.comparingDouble(Pair::getX));

对于基于xVal的反向(降序)顺序:

PriorityQueue<Pair> pq= new PriorityQueue<>(Comparator.comparingDouble(Pair::getX).reversed());

您可以对 yVal 或任何其他 可比较的 字段使用相同的方法,方法是使用 Comparator API.

如果你不想让 Pair class 实现 Comparator 接口,你也可以像这样使用 lambda

PriorityQueue<Pair> queue = new PriorityQueue<>(5, (p1, p2) -> Float.compare(p1.getX(), p2.getX()));

倒序:

PriorityQueue<Pair> queue = new PriorityQueue<>(5, (p1, p2) -> Float.compare(p2.getX(), p1.getX()));

如果您更喜欢静态工厂方法或实用程序函数中的比较逻辑,您可以使用如下方式:

PriorityQueue<Pair> queue = new PriorityQueue<>(NodeUtil::customCompare);

public static int customCompare(Pair p1, Pair p2) {
  return Float.compare(p1.getX(), p2.getX());
}