具有自定义比较器的 Java PriorityQueue

2024-03-23

我正在使用 PriorityQueue 和我自己的比较器,但不知何故,最终结果并不总是好的。 我应该按平均成绩、姓名、身份证号码排序。最后它应该返回有序队列中剩余的名称。其余的名称都可以,但顺序不同。 输入(姓名、平均成绩、id.no):

add John 3,75 50
add Mark 3,8 24
add Shafaet 3,7 35
poll
poll
add Samiha 3,85 36
poll
add Ashley 3,9 42
add Maria 3,6 46
add Anik 3,95 49
add Dan 3,95 50
poll

预期输出:

Dan
Ashley
Shafaet
Maria

我的结果:

Dan
Ashley
Maria
Shafaet

你能帮我找出问题所在吗? 先感谢您!

class StComp implements Comparator<Students> {
        @Override
        public int compare(Students st1, Students st2) {
            if (st1.getCgpa() == st2.getCgpa()) {
                if (st1.getName().equals(st2.getName()))
                    return st1.getId() - st2.getId();
                else
                    return st1.getName().compareTo(st2.getName());
            }
            else
                return (st1.getCgpa() < st2.getCgpa()) ? 1 : -1;
        }
    }

    StComp stComp = new StComp();
    PriorityQueue<Students> pq = new PriorityQueue<Students>(2, stComp);

Your Comparator是正确的。问题是您很可能使用其遍历列表Iterator. The PriorityQueue文档 https://docs.oracle.com/javase/8/docs/api/java/util/PriorityQueue.html状态:

方法 iterator() 中提供的迭代器不保证 以任意特定顺序遍历优先级队列的元素。

如果你要迭代你的PriorityQueue像这样,您应该看到正确的结果:

while (!pq.isEmpty())
    System.out.println(pq.poll().getName());
}

我在这个答案的末尾包含了一个示例来充分演示。


如果您不想清除您的数据,您可以执行以下操作:PriorityQueue。就我个人而言,我不建议将这两种方法作为初始选择PriorityQueue对于用例来说不正确,因为它们不打算被迭代。

你可以复制你的PriorityQueue放入一个数组中,使用您的对它们进行排序Comparator实现,迭代排序数组,例如:

Student[] students = pq.toArray(new Student[pq.size()]);
Arrays.sort(students, new StComp());
for (Student s : students) {
    System.out.println(s.getName() + " " + s.getCgpa() + " " + s.getId());
}

或将它们添加到某种Collection轮询时,然后将它们添加回PriorityQueue, e.g.:

Collection<Student> temp = new LinkedList<>();
while (!pq.isEmpty()) {
    Student s = pq.poll();
    System.out.println(s.getName() + " " + s.getCgpa() + " " + s.getId());
    temp.add(s);
}
pq.addAll(temp);

该示例使用您的数据来演示:

Main

public class Main {

    public static void main(String[] args) {
        PriorityQueue<Student> pq = new PriorityQueue<>(new StComp());
        pq.add(new Student("John", 75, 50)); // Student name, grade average, id
        pq.add(new Student("Mark", 8, 24));
        pq.add(new Student("Shafaet", 7, 35));
        pq.poll();
        pq.poll();
        pq.add(new Student("Samiha", 85, 36));
        pq.poll();
        pq.add(new Student("Ashley", 9, 42));
        pq.add(new Student("Maria", 6, 46));
        pq.add(new Student("Anik", 95, 49));
        pq.add(new Student("Dan", 95, 50));
        pq.poll();

        // Not guaranteed to be in priorty order
        System.out.println("Using PriorityQueue's Iterator, may not be in the correct priority order.");
        for (Student s : pq) {
            System.out.println(s.getName() + " " + s.getCgpa() + " " + s.getId());
        }

        // Correct order, but removes from the Priority Queue
        System.out.println("\nIterating until empty using PriorityQueue.poll(), will be in the correct order.");
        while (!pq.isEmpty()) {
            Student s = pq.poll();
            System.out.println(s.getName() + " " + s.getCgpa() + " " + s.getId());
        }
    }

}

Student(重命名,应该是单数)

public class Student {

    private double cgpa;
    private String name;
    private int id;

    public Student(String name, double cgpa, int id) {
        this.name = name;
        this.cgpa = cgpa;
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public int getId() {
        return id;
    }

    public double getCgpa() {
        return cgpa;
    }

}

StComp(逻辑与问题相同)

public class StComp implements Comparator<Student> {

    @Override
    public int compare(Student st1, Student st2) {
        if (st1.getCgpa() == st2.getCgpa()) {
            if (st1.getName().equals(st2.getName())) {
                return st1.getId() - st2.getId();
            } else {
                return st1.getName().compareTo(st2.getName());
            }
        } else {
            return (st1.getCgpa() < st2.getCgpa()) ? 1 : -1;
        }
    }
}

Output(至少对我来说,第一次的结果可能会有所不同Iterator变体)

Using PriorityQueue's Iterator, may not be in the correct priority order.
Dan 95.0 50
Ashley 9.0 42
Maria 6.0 46
Shafaet 7.0 35

Iterating until empty using PriorityQueue.poll(), will be in the correct order.
Dan 95.0 50
Ashley 9.0 42
Shafaet 7.0 35
Maria 6.0 46
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有自定义比较器的 Java PriorityQueue 的相关文章

随机推荐

  • 如何使用 f"" 字符串而不是 .format() 打印二进制数?

    为了将一些数字打印为其二进制格式 我们只需使用 format 方法 像这样 Binary for i in range 5 1 print 0 gt 2 in binary is 0 gt 08b format i Output 0 in
  • 使用 hibernate-search 的自定义桥时出错

    我有两个实体 Indexed Entity Table name LK CONTACT TYPE public class ContactTypeEntity Id Column name ID DocumentId Integer id
  • 如何在 Windows 7 上卸载 Netbeans 6.9?

    我尝试卸载 Netbeans IDE 由于某种原因它拒绝卸载 当我从控制面板运行卸载程序时 我收到一条消息 安装程序锁定文件位于 c users user nbi nbilock 当我删除文件时 我收到一条消息 在注册表中找不到指定的目标组
  • 保持前 n 个元素按排序顺序的最佳数据结构是什么?

    我正在寻找一种保持顶部的数据结构n元素 类似于这个问题 https stackoverflow com questions 564112 data structure that always keeps n best elements 但增
  • 中值滤波器超高效实现

    我正在寻找快速 高效中值滤波器的 Ansi C 实现 有什么指点吗 到目前为止 我已经找到了下列的 http www eetindia co in STATIC PDF 200011 EEIOL 2000NOV03 EMS EDA TA p
  • 追加和插入都在那里有什么原因吗?

    我肯定不是我想成为的 Python 大师 我主要在业余时间学习 实验 很可能我会为有经验的用户提出一个小问题 但是 我真的很想去理解 这是一个对我帮助很大的地方 现在 在适当的前提之后 Python 文档说 4 6 3 可变序列类型 s a
  • nginx,上游,cors 失败

    无法理解为什么我的上游 CORS 配置失败 这阻碍了一些本地开发和测试 我得到了一个请求的资源上不存在 Access Control Allow Origin 标头当发出 API 请求时local mysite com 8081 to ev
  • 如何使用 ADO.NET 读取 .XLSX (Excel 2007) 文件?我发现“无法找到可安装的 ISAM”错误

    我需要工作于 net 2 0 所以我不能使用 OpenXML 这是我的源代码 我已经安装了AccessDatabaseEngine exe 但仍然遇到异常 找不到可安装的 ISAM 我也尝试过 Extended Properties Exc
  • 如何在编译时运行“npm install”等 bash 命令

    我需要跑npm install gulp build在我的里面static semantic ui文件夹 因此它创建了所需的css file 我看到这个例子Setup hs https github com nakaji dayo yeso
  • JMeter - 使用其他 BeanShell 预处理器/后处理器中的变量?

    有没有一种方法可以将变量从一个 BeanShell 预处理器 后处理器引用到另一个 BeanShell 处理器 它们在同一个线程组内 如果我在 HTTP 请求下的 BeanShell 预处理器内创建一个字符串变量 那么我可以在同一 HTTP
  • 使用 C#/Linq 将扁平化分层数据从 SQL Server 转换为结构化 JSON 对象

    我正在开发一个 MVC 应用程序 它从 SQL Server 中的表中检索数据 其结构如下 Id Name Hierarchy Depth 01 Justin 0 02 Chris 1 1 03 Beth 1 1 2 中的示例数据Hiera
  • ggplot 堆叠条形图每个月的前 5 名

    我有一个很好的 我已经思考这个问题很长时间了 我有这个数据集 这个数据集可能很大 我想根据每月前 5 个最高计数绘制 ggplot 堆栈条形图 例如 对于 1 1 2012 最高计数将为 I G F D 和 E df Date Desc c
  • 使用 ggplot 绘制具有多个预测变量的模型的一个预测变量

    这是线性模型和 ggplot 的典型示例 require ggplot2 utils data anorexia package MASS anorex 1 lt glm Postwt Prewt Treat offset Prewt fa
  • C++ 的属性和反射库?

    大多数成熟的 C 项目似乎都有自己的反射和属性系统 即用于定义可以通过字符串访问并自动序列化的属性 至少我参与的很多C 项目似乎都是这样的重新发明轮子 你知道任何好的开源库对于支持反射和属性容器的 C 具体来说 通过宏定义 RTTI 和属性
  • 包中涉及std::transform的Rcpp代码的兼容性

    我正在完成我一直在做的一个包 所有检查看起来都很好 并且在我的计算机上编译没有问题 win builder包裹也没有问题 作为进一步检查 我尝试在同事的计算机上从源代码安装 但失败了 问题来自于我从中获取的 Rcpp 函数Rcpp 中关于向
  • 内容解析器的使用

    我是 android 领域的新手 正处于学习阶段 我有几个疑问 每个应用程序是否有单个 ContentResolver 对象 它是一个单例对象吗 谁管理这个对象的生命周期 如果是单例 它如何处理查询ContentProvider的多个请求
  • C11编译器一致性比较

    是否有任何网站可以比较实现 编译器之间当前的 C11 标准一致性 支持 gcc clang 英特尔 open64 pelles 据我所知 没有通用网站 现在是开始建立一个网站的好时机 然而 大多数项目都有自己的列表 http clang l
  • 子项目中的 Cocoapods

    我有一个带有子项目的项目 子项目和主项目都必须使用Cocoapods来集成一个库 如果没有Cocoapods 似乎无法集成 所以我为主项目及其子项目设置了 Cocoapods 子项目在其生成的工作区中构建 但编译主项目会产生以下错误 ld
  • 如何使标签文本左右对齐以具有相同的对齐方式?

    我使用 html 和 CSS 处理模板 我面临的问题是我无法使左右对齐标签文本相同 作为例子 提交日期和员工 ID 不是从左侧的同一点开始 因此我需要左侧的所有文本都具有相同的对齐方式 同样在右侧 文本也不是从与 和 相同的点开始 所以我需
  • 具有自定义比较器的 Java PriorityQueue

    我正在使用 PriorityQueue 和我自己的比较器 但不知何故 最终结果并不总是好的 我应该按平均成绩 姓名 身份证号码排序 最后它应该返回有序队列中剩余的名称 其余的名称都可以 但顺序不同 输入 姓名 平均成绩 id no add