当前位置: 首页 > 知识库问答 >
问题:

维护成对的PriorityQueue,以便根据Pair类[duplicate]的两个字段对其元素进行排序

左丘成仁
2023-03-14

我有两个数组X

// 1] Using Lambda Operator
public static void main(String[] args)
{
    PriorityQueue<Pair> pTq = new PriorityQueue<>((x, y) -> (x.X == y.X) ? x.Y-y.Y : x.X-y.X);
    int[] X = {1, 6, 4, 9, 13, 13, 5, 20, 7, 6};
    int[] Y = {2, 9, 13, 4, 8, 1, 16, 7, 5, 5};
    for (int i=0; i<10; i++)
        pTq.add(new Pair(X[i] , Y[i]));
    System.out.println( pTq );
}
// 2] Using Custom Comparator
public static void main(String[] args)
{
    PriorityQueue<Pair> pTq = new PriorityQueue<Pair>(Comparator.comparing(Pair::getX).thenComparing(Pair::getY));

    int[] X = {1, 6, 4, 9, 13, 13, 5, 20, 7, 6};
    int[] Y = {2, 9, 13, 4, 8, 1, 16, 7, 5, 5};
    for (int i=0; i<10; i++)
        pTq.add(new Pair(X[i] , Y[i]));
    System.out.println( pTq );
}
// 3] Again Custom Comparator
public static void main(String[] args)
{
    PriorityQueue<Pair> pTq = new PriorityQueue<>(new Comparator<Pair>()
    {
        @Override
        public int compare(Pair a, Pair b)
        {
            return (a.X == b.X) ? a.Y-b.Y : a.X-b.X;
        }
    });
    int[] X = {1, 6, 4, 9, 13, 13, 5, 20, 7, 6};
    int[] Y = {2, 9, 13, 4, 8, 1, 16, 7, 5, 5};
    for (int i=0; i<10; i++)
        pTq.add(new Pair(X[i] , Y[i]));
    System.out.println( pTq );
}
// Pair Class for all of the above
class Pair
{
    int X, Y;
    Pair (int x, int y)
    {
        X = x;
        Y = y;
    }
    int getX(){return X;}
    int getY(){return Y;}
    public String toString()
    {
        return ("("+X+" , "+Y+")");
    }
}

期望结果:[(1 , 2), (4 , 13), (5 , 16), (6 , 5), (6 , 9), (7 , 5), (9 , 4), (13 , 1), (13 , 8), (20 , 7)]

实际结果:[(1,2)、(6,5)、(4,13)、(7,5)、(6,9)、(13,1)、(5,16)、(20,7)、(9,4)、(13,8)]

我知道我想在这里实现的可以用其他数据结构来完成,比如带有自定义比较器的对列表,但是我想知道这里有什么错误或者我在这里错过了什么。谢谢。

共有1个答案

凌和颂
2023-03-14

您的优先级队列中的元素已经按正确的顺序排列。您被打印的顺序误导了-请参见PriorityQueue.to字符串错误的元素顺序

如果在循环中重复调用poll,则可以验证相同的结果。

 类似资料:
  • 问题内容: 我有以下收藏: 当这个样子的: 现在我必须根据字段对集合进行排序,如何实现呢? 问题答案: 这是我的“ 1班轮”: Java 8的更新:对于int数据类型 甚至: 对于String数据类型(如注释中所示) ..它期望吸气剂

  • 我知道关于这个问题有很多答案。我试着跟随它,但它不会显示我想要的结果。有一个 输入 603 502 201 402 303 301 我希望 输出 60 3 50 2 40 2 30 3 30 1 20 1 但是如果我打印优先级队列,它将显示 60 3 50 2 40 2 20 1 30 3 30 1 我不知道为什么。。 下面是我的代码

  • 本文向大家介绍php根据某字段对多维数组进行排序的方法,包括了php根据某字段对多维数组进行排序的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php根据某字段对多维数组进行排序的方法。分享给大家供大家参考。具体分析如下: 根据某字段对多维数组进行排序,在看到array_multisort方法的作用时突然想到,可以用来做这个方法 这段代码可实现根据field字段对数组进行排序 希望本

  • 问题内容: 我有一张像这样的表: SQL或蜂巢中是否有一种方法可以将其转换为类似表的形式: 我不确定有没有一个词来描述这种操作…任何帮助将不胜感激! 问题答案: 这基本上是一个。您没有指定要使用的RDBMS,但是可以使用聚合函数和语句在任何数据库中获取结果: 参见带有演示的SQL Fiddle 结果:

  • 问题内容: 我有一个从排序的csv创建的以下列表 我实际上想按两个条件对列表进行排序:首先按字段1中的值,然后按字段2中的值。我该怎么做? 问题答案: 像这样:

  • 我在我的一个Java 15项目类中有一个ArrayList,它看起来如下所示: ArrayList包含字符串,其中每个元素是学生的姓名和他们的考试标记,中间有一个冒号。 目的是按照从低到高的顺序对此列表进行排序。要怎么做呢?