Java实现对象排序的两种方式详解

 更新时间:2023年09月18日 10:13:52   作者:努力的小鳴人  
这篇文章主要介绍了Java实现对象排序的两种方式详解,在Java中经常会涉及到对象数组的排序问题,则就提到对象之间的比较问题,今天我们就来看一下两种不同排序方式之间的区别,需要的朋友可以参考下

一、Java实现对象排序的两种方式

在Java中经常会涉及到对象数组的排序问题,则就提到对象之间的比较问题

  • 自然排序:java.lang.Comparable
  • 定制排序:java.util.Comparator

二、方式一:自然排序

java.lang.Comparable

  • 定义:Comparable接口强行对实现它的每个类的对象进行整体排序
  • 内容:实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小
  • 结果:如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数,如果当前对象this等于形参对象obj,则返回零
  • 举例:
class Goods implements Comparable {
    private String name;
    private double price;
    public Goods(String name, double price) {
        this.name = name;
        this.price = price;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getPrice() {
        return price;
    }
    public void setPrice(double price) {
        this.price = price;
    }
    @Override
    public String toString() {
        return "Goods{" + "name='" + name + '\'' + ", price=" + price + '}';
    }
    //按照价格,比较商品的大小
    @Override
    public int compareTo(Object o) {
        if (o instanceof Goods) {
            Goods other = (Goods) o;
            if (this.price > other.price) {
                return 1;
            } else if (this.price < other.price) {
                return -1;
            }
            return 0;
        }
        throw new RuntimeException("输入的数据类型不一致");
    }
}
  • 创建ComparableTest类来测试:
import java.util.Arrays;
public class ComparableTest {
    public static void main(String[] args) {
        Goods[] all = new Goods[4];
        all[0] = new Goods("《红楼梦》", 100);
        all[1] = new Goods("《西游记》", 80);
        all[2] = new Goods("《三国演义》", 140);
        all[3] = new Goods("《水浒传》", 120);
        Arrays.sort(all);
        System.out.println(Arrays.toString(all));
    }
}

结果为:

[Goods{name='《西游记》', price=80.0}, Goods{name='《红楼梦》', price=100.0}, Goods{name='《水浒传》', price=120.0}, Goods{name='《三国演义》', price=140.0}]

Comparable 的典型实现

(从小到大)

  1. String:按照字符串中字符的Unicode值进行比较
  2. Character:按照字符的Unicode值来进行比较数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较
  3. Boolean:true 对应的包装类实例大于 false 对应的包装类实例
  4. Date、Time等:后面的日期时间比前面的日期时间大

注:实现Comparable接口的对象可以通过 Collections.sort 或Arrays.sort进行自动排序

三、方式二:定制排序

java.util.Comparator

  • 情况:当元素类型没有实现Comparable接口而又不方便修改代码,或实现了Comparable接口但排序规则不适合当前的操作,那么可考虑用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较
  • 结果:重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2
  • 举例:与方式一中相同,此处省略;
  • 创建ComparatorTest类用来测试:(比较名字首字母)
import java.util.Arrays;
import java.util.Comparator;
public class ComparatorTest {
    public static void main(String[] args) {
        Goods[] all = new Goods[4];
        all[0] = new Goods("War and Peace", 100);
        all[1] = new Goods("Childhood", 80);
        all[2] = new Goods("Scarlet and Black", 140);
        all[3] = new Goods("Notre Dame de Paris", 120);
        Arrays.sort(all, new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                Goods g1 = (Goods) o1;
                Goods g2 = (Goods) o2;
                return g1.getName().compareTo(g2.getName());
            }
        });
        System.out.println(Arrays.toString(all));
    }
}

运行结果:

[Goods{name='Childhood', price=80.0}, Goods{name='Notre Dame de Paris', price=120.0}, Goods{name='Scarlet and Black', price=140.0}, Goods{name='War and Peace', price=100.0}]

四、两种方式比较

Comparable接口的方式一旦确定,保证Comparable接口实现类的对象在任何位置都可以比较大小而Comparator接口属于临时性的比较

到此这篇关于Java实现对象排序的两种方式详解的文章就介绍到这了,更多相关Java对象排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java基于阻塞队列实现生产者消费者模型示例详解

    Java基于阻塞队列实现生产者消费者模型示例详解

    这篇文章主要介绍了Java基于阻塞队列实现生产者消费者模型,阻塞队列的特点就是阻塞两个字,阻塞功能使得生产者和消费者两端的能力得以平衡,当有任何一端速度过快时,阻塞队列便会把过快的速度降下来,感兴趣的朋友可以参考下
    2023-12-12
  • spring boot中xalan引入报错系统找不到指定的文件原因分析

    spring boot中xalan引入报错系统找不到指定的文件原因分析

    这篇文章主要介绍了spring boot中xalan引入报错系统找不到指定的文件,主要原因是内嵌的tomcat9.0.36,本文给大家分享最新解决方法,需要的朋友可以参考下
    2023-08-08
  • JPA+Enum枚举实现步骤流程

    JPA+Enum枚举实现步骤流程

    本文介绍了如何在Java中创建学生实体类及Sex枚举类,并通过@JsonValue注解实现枚举序列化,使用JPA的@Converter及AttributeConverter完成枚举与数据库字段的转换,最后通过controller层进行新增与查询测试
    2025-10-10
  • 浅谈Java 继承接口同名函数问题

    浅谈Java 继承接口同名函数问题

    这篇文章主要介绍了浅谈Java 继承接口同名函数问题。具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 一文带你弄懂Maven拉包(拉取依赖包)原理

    一文带你弄懂Maven拉包(拉取依赖包)原理

    业务需求开发的时候,我们总是会遇到拉不到依赖包的情况,此时如果不清楚 Maven 拉取依赖包的原理,那么很可能找不到问题所在,今天小编就带大家了解下 Maven 拉包的原理,让你在遇到问题的时候能快速解决,需要的朋友可以参考下
    2023-07-07
  • java版微信和支付宝退款接口

    java版微信和支付宝退款接口

    这篇文章主要为大家详细介绍了java版微信退款接口和java版支付宝退款接口,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-09-09
  • Spring集成Web环境的实例详解

    Spring集成Web环境的实例详解

    这篇文章主要介绍了Spring集成Web环境,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • 详解spring与shiro集成

    详解spring与shiro集成

    这篇文章主要介绍了详解spring与shiro集成,需要的朋友可以参考下
    2017-09-09
  • Spring Boot整合Bootstrap的超详细步骤

    Spring Boot整合Bootstrap的超详细步骤

    之前做前端开发,在使用bootstrap的时候都是去官网下载,然后放到项目中,在页面引用,下面这篇文章主要给大家介绍了关于Spring Boot整合Bootstrap的超详细步骤,需要的朋友可以参考下
    2023-05-05
  • 解决idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题

    解决idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题

    这篇文章主要介绍了idea2020.2遇到pom.xml文件报错maven插件tomcat7的问题,本文给大家分享解决方法,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09

最新评论