具有ArrayList和对的Java优先级队列

问题描述

我正在寻找一种简单的方法来用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建立两个优先级队列:

  • 根据x值从低到高排序的一个
  • 在y值上排序的一个从低到高。

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

我确实查看了关于堆栈溢出的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);

如何访问配对以使其与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());

您可以通过使用Comparator APIyVal或任何其他可比较字段使用相同的方法。

,

如果您不希望Pair类实现Comparator接口,也可以使用lambda这样的方式

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

对于相反的顺序:

PriorityQueue<Pair> queue = new PriorityQueue<>(5,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());
}