【问题标题】:Java Priority Queue with ArrayLists and Pairs具有 ArrayLists 和 Pairs 的 Java 优先级队列
【发布时间】: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

标签: java sorting arraylist priority-queue


【解决方案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());
}

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2017-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多