java自定义对象集合排序

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情

一、基本对象集合排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * @Package: PACKAGE_NAME
 * @ClassName: IntListTest
 * @Author: tanp
 * @Description: ${description}
 * @Date: 2020/9/8 14:42
 */
public class IntListTest {
    public static void main(String[] args) {
        List<Integer> integerList = new ArrayList<>();
        Random r = new Random();
        for(int i=0; i<10; i++){
            integerList.add(r.nextInt(100));
        }
        System.out.println(integerList);
        Collections.sort(integerList);
        System.out.println(integerList);
    }

}

从上面的代码里我们可以看出,对于基本类型的数据我们可以直接调用Collections.sort();方法即可,但是对于我们自定的对象呢,如何排序呢

二、自定义对象集合排序

自定义对象集合排序有两种方法

1.自定义一个Comparator比较器

compare()方法用来给两个输入参数排序,返回负数,0,正数,表明第一个参数是小于,等于,大于第二个参数

import java.util.*;

/**
 * @ClassName: Dog
 * @Author: tanp
 * @Description: ${description}
 * @Date: 2020/9/7 17:29
 */
public class Dog {

    private String name;
    private int length;
    private int weight;

    public Dog(String name, int length, int weight) {
        this.name = name;
        this.length = length;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }


    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", length=" + length +
                ", weight=" + weight +
                '}';
    }

    public static void main(String[] args) {
        List<Dog> dogs = new ArrayList<>();
        Random r =new Random();
        for (int i = 0; i < 5; i++) {
            dogs.add(new Dog("dog"+i,r.nextInt(100), r.nextInt(100)));
        }
        System.out.println(dogs);

        //直接调用sort会出现编译错误,因为Dog有各种属性
        //到底按照哪种属性进行比较,Collections也不知道,不确定,所以没法排
        //Collections.sort(dogs);

        //引入Comparator,指定比较的算法
        Comparator<Dog> c = new Comparator<Dog>() {
            @Override
            public int compare(Dog dog1, Dog dog2) {
                //按照hp进行排序
                if(dog1.weight>=dog2.weight){
                    //正数表示h1比h2要大
                    return 1;
                }else{
                    return -1;
                }
            }
        };
        Collections.sort(dogs,c);
        System.out.println("按体重排序后的集合:");
        System.out.println(dogs);

    }
}

2.实现Comparable接口

Comparable接口里的compareTo()方法,可以个给两个对象排序。具体来说,它返回负数,0,正数,来表明已经存在的对象小于,等于,大于输入对象。

import java.util.*;

/**
 * @Package: PACKAGE_NAME
 * @ClassName: Dog1
 * @Author: tanp
 * @Description: ${description}
 * @Date: 2020/9/7 17:59
 */
public class Dog1 implements Comparable<Dog1> {

    private String name;
    private int length;
    private int weight;

    public Dog1(String name, int length, int weight) {
        this.name = name;
        this.length = length;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLength() {
        return length;
    }

    public void setLength(int length) {
        this.length = length;
    }

    public int getWeight() {
        return weight;
    }

    public void setWeight(int weight) {
        this.weight = weight;
    }


    @Override
    public String toString() {
        return "Dog1{" +
                "name='" + name + '\'' +
                ", length=" + length +
                ", weight=" + weight +
                '}';
    }

    @Override
    public int compareTo(Dog1 dog1) {
        if (weight > dog1.weight) {
            return 1;
        } else {
            return -1;
        }
    }

    public static void main(String[] args) {
        List<Dog1> dogs = new ArrayList<>();
        Random r =new Random();
        for (int i = 0; i < 5; i++) {
            dogs.add(new Dog1("dog"+i,r.nextInt(100), r.nextInt(100)));
        }
        System.out.println(dogs);

        //重写了比较方法可直接调用比较方法
        Collections.sort(dogs);
        System.out.println("按体重排序后的集合:");
        System.out.println(dogs);

    }
}

三、Comparator 和 Comparable 的区别

    Comparable 定义在自定义对象类的内部,且已经实现了比较器,所以对于自定义对象而言,它现在是一个可以比较大小的对象了,它的比较功能和String完全一样,可以随时随地的拿来。Comparator 是定义在自定义对象的外部的, 此时我们的自定义对象类的类结构不需要有任何变化。

    总的来说,使用Comparable方式比较时,我们将比较的规则写入了比较的类型中,其特点是高内聚。但如果哪天这个规则需要修改,那么我们必须修改这个类型的源代码。如果使用Comparator方式比较,那么我们不需要修改比较的类,其特点是易维护,但需要自定义一个比较器,后续比较规则的修改,仅仅是改这个比较器中的代码即可。

一篇文章搞定Java中常用集合排序方法 最近在做算法题的时候,发现排序在大部分题中都不可或缺,今天心血来潮,总结下Java集合排序常用的方法,基本覆盖了大部分的排序场景(特别是自定义比较器,太好用叻( ̄▽ ̄)/)文中提到的自然顺序排序,对于可比较大小的数据类型,一般按照从小到大的顺序,无法比较大小的,一般指按字典序升序排列。 阅读详情

相关推荐

Java Arrays.sort和Collections.sort排序实现原理解析

主要介绍了Java Arrays.sort和Collections.sort排序实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

Java中Collections.sort()的原理

Collection.sort()用来对集合进行排序 sort()中有两个参数 一个是List,集合的实例 还有一个是比较器comparator,比较器决定了集合中元素的排列方式 如果集合中的元素只是单纯的String或int等默认的数据类型的话 直接使用如下代码即可升序排序 Collections.sort(List) 如果想要降序,则更改比较器函数 Collections.sort(List,new Comparator<List中元素的数据类型/类名>(){

qq_33880925的博客 1万+

Jenkins插件下载慢?3分钟搞定国内镜像加速(含华为/腾讯/清华源对比)

本文详细介绍了如何通过国内镜像源加速Jenkins插件下载,包括华为云、腾讯云和清华源等主流镜像站的性能对比及一键配置方案。通过实测数据展示华为云镜像站表现最佳,下载速度达19.4MB/s,并提供sed命令、管理界面配置和Docker定制三种高效加速方案,帮助开发者快速解决插件下载慢的问题。

sql99的博客 297

java Collections.sort排序原理

事实上Collections.sort方法底层就是调用的Arrays.sort方法,而Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。 快速排序主要是对那些基本类型数据(int,short,long等)排序, 而归并排序用于对Object类型进行排序。 使用不同类型的排序算法主要是由于快速排序是不稳定的,而归并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前...

憧憬的专栏 1万+

对象集合如何根据对象的某一个属性排序

对象集合如何根据对象的某一个属性排序

wang20010104的博客 2586

java 集合自定义对象的几种排序方法

java 集合自定义对象的几种排序方法1. 通过实现Comparable接口,来对集合中的自定义对象排序代码:import java.util.*;//student类,并实现Comparable接口 class Student implements Comparable<Student>{ //姓名,成绩,年龄三个变量 private String name; priva

这儿有个bug 1万+

Java 集合自定义对象属性排序

自定义对象属性进行排序,一般是实现Comparable接口或实现Comparator接口 1. 实现Comparable接口 package CollectionKnowledge; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util...

技术小青年一枚 1904

Java自定义对象数组、集合排序

//实体类: package CategoryDp2; import java.util.Comparator; public class Cat implements Comparator,Comparable{ private int weight; public int getWeight() { return weight; } public v

u011921490的专栏 1838

Java自定义对象集合排序

1. 方案一:自定义对象实现 Comparable<> 接口

assiduous_me的博客 972

java对set对象排序_Java 往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序。...

Set:无序,不可以重复元素。|--HashSet:数据结构是哈希表。线程是非同步的。保证元素唯一性的原理:判断元素的hashCode值是否相同。如果相同,还会继续判断元素的equals方法,是否为true。|--TreeSet:可以对Set集合中的元素进行排序。底层数据结构是二叉树。保证元素唯一性的依据:compareTo方法return 0.TreeSet排序的第一种方式:让元素自身具备比较性...

weixin_29888579的博客 250

java怎么帮set集合对象排序_JAVA基础(TreeSet存储自定义对象比较排序

1,TreeSet存储自定义对象存储Person对象 bean类里面必须实现Comparable 方法。(implements Comparable)TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一当compareTo方法返回0的时候集合中只有一个元素当compareTo方法返回正数的时候集合会怎么存就怎么取当compareTo方法返回负数的时候集合会倒序存储2,代码实现【...

weixin_39934085的博客 276

Java 自定义排序,给定一个对象集合排序

Java 自定义排序,给你一个集合,将集合里面的数据按照111 121 131 112 122 103 211 221 S231 这个顺序 排序。如果你想要将其视为比所有元素都小,可以将相应的返回值改为-1。如果dataToSort 是一个和实体类集合呢比如,List,将JcC里面的属性Zszl进行排序。列表非常大,并且你经常需要执行这种查找操作,那么考虑使用更高效的数据结构(如。值,你需要对这个方法进行相应的调整以避免。对象的相对位置,并据此进行排序。中,上面的代码将其视为比所有在。

weixin_60948956的博客 484

java 自定义对象集合排序

List m = new ArrayList HashSet mm = new HashSet m.addAll(mm); m.sort(new Comparator() { @Override public int compare(Menu o1, Menu o2) { if (o1.getSortNum() >= o2.getSortNum()) return 1; retur

a1965483733的博客 434

java对象集合快速排序,Java针对ArrayList自定义排序的2种实现方法,javaarraylist

Java针对ArrayList自定义排序的2种实现方法,javaarraylist本文实例讲述了Java针对ArrayList自定义排序的2种实现方法。分享给大家供大家参考,具体如下:Java实现对list的自定义排序主要通过两种方式1)让需要进行排序对象的类实现Comparable接口,重写compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用Collections.sor...

weixin_39557419的博客 345

java集合属性定义_Java 集合自定义对象属性排序

自定义对象属性进行排序,一般是实现Comparable接口或实现Comparator接口1. ComparableComparator接口的区别参数ComparableComparator排序逻辑排序逻辑必须在待排序对象的类(pojo类)中排序逻辑单独实现实现pojo类实现Comparable接口自定义Comparator接口排序方法int compareTo(Object o1)int c...

weixin_39688856的博客 176

Java 往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序

往TreeSet集合中存储自定义对象学生,按照学生的年龄进行排序

hoho_12 5797

java 遍历 treemap_TreeMap集合自定义对象的遍历排序方式

第一部分:package day11;//创建学生类public class Student{//成员变量private String name;private int age;//构造方法public Student(){super();}public Student(String name, int age){this.name = name;this.age = age;}//成员方法pub...

weixin_29501693的博客 551

Java 两种TreeSet集合自定义对象属性排序Comparator接口 或 Comparable接口

前言:TreeSet和HashSet的区别在于, HashSet不可以进行排序,TreeSet可以进行排序, 默认使用字典顺序排序, 也可以进行自定义排序。 1,但实际使用HashSet时会发现,HashSet好像会自动进行了排序,为什么呢? 原因:HashSet是set的子集,Set的底层是Map实现的,Map的实现是散列码,就是根据key的hashcode计算出来的,通过这个hashcod...

_夜渐凉 696

Java根据自定义规则排序

自定义对象集合排序

ElvisDream的博客 368

Java 两种ArrayList集合自定义对象属性排序Comparator接口 或 Comparable接口

1,Comparator接口 —— 重写Comparator public class User { private String id; private String name; public User (String id, String name) { this.id = id; this.name = name; } ...

_夜渐凉 462
上一篇: java的内部类的分类
下一篇: JAVA8 关于集合的LAMBDA聚合操作
bird_tp
博客等级 码龄10年 191粉丝 246原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值