问题描述
我正在寻找一种简单的方法来用Java构建优先级队列。我建立了一个ArrayList<Pair>
,每个Pair
实例都包含一个X
和Y
值。
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表达式执行此操作的简单方法。
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);
如何访问配对以使其与x1
和x2
进行比较?
请注意,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 API对yVal
或任何其他可比较字段使用相同的方法。
如果您不希望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());
}