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

Posted

技术标签:

【中文标题】具有 ArrayLists 和 Pairs 的 Java 优先级队列【英文标题】:Java Priority Queue with ArrayLists and Pairs 【发布时间】:2020-10-11 16:39:43 【问题描述】:

我正在寻找用 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 表达式的简单方法。

我确实在 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&lt;Pair&gt; listOfPoints 的长度。

【问题讨论】:

您好,我提供了该链接作为参考,它正下方的代码块是我发现该链接有用的内容。我想要的是一个在优先队列中使用的 lambda 表达式,知道我使用的是类 而不是 PntPair 构造函数不会为 Pair 类编译。请edit您的问题并格式化。 你的数组列表应该是List&lt;Pair&gt; 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。

【讨论】:

了解如何在 上使用它,但不确定如何在我的班级 上使用 Lambada 表达式。我想访问 Pair X1 和 Pair X2 并根据该比较中 X 的最小值对优先级队列进行排序。 太棒了,谢谢!我会试一试。 Comparator 可以在浮点值上运行吗? 查看答案中提供的 Comparator API 链接。有不同的 comparingX 方法,所以,是的,它可以比较浮点数。【参考方案2】:

如果不希望 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 优先级队列的主要内容,如果未能解决你的问题,请参考以下文章

Reverse Pairs

493. Reverse Pairs

LeetCode 493. Reverse Pairs

HDU - 6534 Chika and Friendly Pairs

codechef Scoring Pairs

2017北大校赛 J题 pairs