Java基础二十二(对集合元素排序比较)

这篇具有很好参考价值的文章主要介绍了Java基础二十二(对集合元素排序比较)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

对集合元素排序比较

1. 使用 Comparable 接口实现默认排序

Comparable 是 Java 中的一个接口,用于定义对象之间的排序规则。

实现了 Comparable 接口的类可以比较其对象的大小(包装类都实现了该接口),从而可以在集合类(如 TreeSet、TreeMap 等)中进行排序和查找操作。这种排序被称为类的自然排序,类的 compareTo() 方法被称为它的自然比较方法。

public interface Comparable<T> {
	int compareTo(T o);
}

compareTo() 方法的返回值有以下三种情况:

  • 返回负整数:表示当前对象小于传入对象。
  • 返回零:表示当前对象等于传入对象。
  • 返回正整数:表示当前对象大于传入对象。
  • T 是泛型的一种表现方式,表示一种类型。

示例1
学生类 Student 实现了 Comparable 接口,重写了 compareTo() 方法,通过比较总成绩实现对象之间的大小比较。

public class Student implements Comparable{
    private String name;
    private int math;
    private int chinese;

    public Student(String name, int math, int chinese) {
        this.name = name;
        this.math = math;
        this.chinese = chinese;
    }

    public int getMath() {
        return math;
    }

    public int getChinese() {
        return chinese;
    }

    // 获取总成绩
    public int getTotal() {
        return math + chinese;
    }

    // 根据方法重写比较器
    @Override
    public int compareTo(Object o) throws RuntimeException {
        if (o instanceof Student student) {
            if (this.getTotal() > student.getTotal()) {
                return 1;
            } else if (this.getTotal() < student.getTotal()) {
                return -1;
            }
            // 比较姓名
            return this.name.compareTo(student.name);
        }
        throw new CompareException("类型不匹配");
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", math=" + math +
                ", chinese=" + chinese +
                '}' + getTotal();
    }

    // 自定义异常
    class CompareException extends RuntimeException {
        public CompareException() {
            super();
        }

        public CompareException(String message) {
            super(message);
        }
    }
}

public class ComparableExample {
    public static void main(String[] args) {
        Student[] stus = {
                new Student("张三", 23, 90),
                new Student("李四", 24, 80),
                new Student("王五", 23, 70),
                new Student("赵六", 24, 80),
                new Student("田七", 25, 50)
        };
        sort(stus);
        for (Student student : stus) {
            System.out.println(student.toString());
        }
    }

    private static void sort(Student[] students) {
        for (int i = 0; i < students.length - 1; i++) {
            for (int j = 0; j < students.length - 1 - i; j++) {
                if (students[j].compareTo(students[j + 1]) < 0) {
                    Student studentTemp = students[j];
                    students[j] = students[j + 1];
                    students[j + 1] = studentTemp;
                }
            }
        }
    }
}

输出

Student{name='张三', math=23, chinese=90}113
Student{name='赵六', math=24, chinese=80}104
Student{name='李四', math=24, chinese=80}104
Student{name='王五', math=23, chinese=70}93
Student{name='田七', math=25, chinese=50}75

2. 使用 Comparator 接口实现比较器排序

Comparator 是 java 中的一个接口,用于定义对象之间的定制排序规则。

Comparable 接口不同,Comparator 接口允许在排序时使用独立于对象类的比较逻辑,因此可以在不休改对象类的情况下实现多种不同的排序方式,当使用了实现 Comparator 接口的比较器后,默认的 COmparable 比较器就不起作用了。

使用 Comparator 接口需要重写 compare() 方法,该方法的定义语法格式如下:

public interface Comparator<T> {
	int compare(T o1, T o2);
	boolean equals(Object obj);
}

示例2
按照语文成绩排序

import java.util.Arrays;
import java.util.Objects;

public class ComparableExample {
    public static void main(String[] args) {
        Student[] stus = {
                new Student("张三", 23, 90),
                new Student("李四", 24, 80),
                new Student("王五", 43, 70),
                new Student("赵六", 24, 80),
                new Student("田七", 25, 50)
        };
		// 使用 Arrsys.sort(),传入比较器,实现对多个对象比较
        ChineseComparator comparator = new ChineseComparator();
        Arrays.sort(stus, comparator);
        for (Student student : stus) {
            System.out.println(student.toString());
        }

		// 比较两个对象
//        int n = Objects.compare(stus[1], stus[3], comparator);
//        System.out.println(n);
    }
package kfm.bases.SetDemo;

import java.util.Comparator;

public class ChineseComparator implements Comparator {
	// 按照语文成绩排序
    @Override
    public int compare(Object o1, Object o2) {
        if (o1 != null && o2 != null) {
            if (o1 instanceof Student student1 && o2 instanceof Student student2) {
                return student1.getChinese() - student2.getChinese();
            } else {
                throw new RuntimeException("数据类型异常");
            }
        } else {
            throw new RuntimeException("空指针异常");
        }
    }
}

输出:

Student{name='田七', math=25, chinese=50}75
Student{name='王五', math=43, chinese=70}113
Student{name='李四', math=24, chinese=80}104
Student{name='赵六', math=24, chinese=80}104
Student{name='张三', math=23, chinese=90}113

compare() 方法用于在 Arrays 类调用 sort(比较对象数组, 比较器) 方法时,对两个对象进行比较大小。文章来源地址https://www.toymoban.com/news/detail-688268.html

到了这里,关于Java基础二十二(对集合元素排序比较)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【从零开始学习JAVA | 第二十二篇】BigInteger

    目录  前言:  BigInterger: BigInteger常见的方法: 总结:         本篇我们将介绍BigInteger这个比较实用一点的API,这个API在我们实际写项目中都是很实用的API,因此大家应该对这个API有更加熟练的掌握。 在Java中,整数类型int和long的取值范围是有限的,超出该范围的整数无法

    2024年02月15日
    浏览(66)
  • 【Java EE初阶二十二】https的简单理解

             当前网络上,主要都是 HTTPS 了,很少能见到 HTTP.实际上 HTTPS 也是基于 HTTP.只不过 HTTPS 在 HTTP 的基础之上, 引入了\\\"加密\\\"机制;引入 HTTPS 防止你的数据被黑客篡改 ;         HTTPS 就是一个重要的保护措施.之所以能够安全, 最关键的在于\\\"加密”;         明文:

    2024年02月22日
    浏览(52)
  • 部署问题集合(二十二)Linux设置定时任务,并设置系统时间

    因为项目中经常用到定时任务,特此总结记录一下 大部分虚拟机创建后就自带定时服务,直接用命令就好 编辑定时任务: crontab -e ,在该文件下添加如下内容 开机自启: @reboot /home/autoRun.sh 定时执行: 0 0 * * * /home/sutoRun.sh (凌晨十二点执行) 时间后也可以接命令 若要在该

    2024年02月11日
    浏览(40)
  • Java遍历集合元素并修改

    结论:fori循环可以修改、删除、添加,但是要注意的是下标还是元素;增强for循环内,可以修改,不可以删除、添加。想要删除、添加,使用集合迭代器的删除、添加方法。 对List和Set的遍历,有四种方式,下面以ArrayList为例进行说明。 1.1 fori循环 使用普通for循环的遍历方式

    2024年02月06日
    浏览(37)
  • java 集合去重、获取、统计重复元素

    开发过程中常遇见的三种问题:集合去重、获取重复元素、统计重复次数。 网上搜了下,实现过程五花八门,这里简单汇总下我觉得比较常用的方式: 方法:List转set;一行代码即可; 前提是不需要获取重复元素和统计重复次数 ,最简单的就是把List转为Set,众所周知,set的

    2024年02月16日
    浏览(53)
  • java 两个list比较,删除相同的元素

    概述 在Java开发中,经常需要比较两个List并删除相同的元素。本文将介绍整个流程,并提供相应的代码示例,帮助新手开发者完成这个任务。 流程 下面是比较两个List并删除相同元素的流程: 代码示例 创建两个List 我们首先需要创建两个List对象,分别代表待比较的两个列表

    2024年02月07日
    浏览(44)
  • 【从零开始学JAVA | 第二十四篇】单列集合的遍历

    目录 前言: 单列集合的遍历方式: 迭代器遍历: 增强for遍历: lambda方法遍历:  总结: 本篇我们会讲解关于单列集合的几种遍历方式,遍历集合可以说是对于集合要求掌握的最低技能,因此我们要熟练的掌握遍历集合的方式。 在这里我们不讲for循环遍历,for循环无法对单

    2024年02月16日
    浏览(58)
  • 【从零开始学习JAVA | 第二十三篇】集合体系结构

    目录 前言: 单列集合:      set与list的区别: 双列集合: map的特点: 总结:                   JAVA中为我们提供了很多集合,这些集合都有自己很独特的特点,因此我们要学习所有的集合,但是在学习所有的集合之前,我们还是先为大家介绍一下JAVA的集合体系结构,这

    2024年02月16日
    浏览(56)
  • 【在Java中如何判断元素是否在集合中】

    在Java编程中,集合是非常常见的数据结构之一。在处理集合数据时,经常需要判断某个元素是否在集合中。本文将介绍在Java中如何判断元素是否在集合中,以及常用的方法和技巧。 在Java中,判断元素是否在集合中通常使用以下两种方式: 使用contains()方法 使用containsAll()方

    2024年01月17日
    浏览(54)
  • 从零开始学习 Java:简单易懂的入门指南之Collection集合及list集合(二十一)

    1.1数组和集合的区别 相同点 都是容器,可以存储多个数据 不同点 数组的长度是不可变的,集合的长度是可变的 数组可以存基本数据类型和引用数据类型 集合只能存引用数据类型,如果要存基本数据类型,需要存对应的包装类 1.2集合类体系结构 1.3Collection 集合概述和使用 Collec

    2024年02月10日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包