具有 ArrayLists 和 Pairs 的 Java 优先级队列
Posted
技术标签:
【中文标题】具有 ArrayLists 和 Pairs 的 Java 优先级队列【英文标题】:Java Priority Queue with ArrayLists and Pairs 【发布时间】:2020-10-11 16:39:43 【问题描述】:我正在寻找用 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 表达式的简单方法。
我确实在 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
的长度。
【问题讨论】:
您好,我提供了该链接作为参考,它正下方的代码块是我发现该链接有用的内容。我想要的是一个在优先队列中使用的 lambda 表达式,知道我使用的是类PntPair
构造函数不会为 Pair
类编译。请edit您的问题并格式化。
你的数组列表应该是List<Pair> listOfPoints
【参考方案1】:
对于基于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 类实现 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());
【讨论】:
以上是关于具有 ArrayLists 和 Pairs 的 Java 优先级队列的主要内容,如果未能解决你的问题,请参考以下文章