Java 具有 ArrayLists 和 Pairs 的优先级队列
Java Priority Queue with ArrayLists and Pairs
我正在寻找在 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
,我想建立两个优先级队列:
- 按 x 值从低到高排序的一个。
- 一个按 y 值从低到高排序的。
我正在寻找一种使用 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 以便比较 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());
您可以对 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());
}
我正在寻找在 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
,我想建立两个优先级队列:
- 按 x 值从低到高排序的一个。
- 一个按 y 值从低到高排序的。
我正在寻找一种使用 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 以便比较 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());
您可以对 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());
}