首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java—Sort排序

Java—Sort排序

作者头像
全栈程序员站长
发布于 2022-09-14 07:34:29
发布于 2022-09-14 07:34:29
1.1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

Java中Sort排序是非常常用的方法,这一章我们主要来认识一下Sort的用法和相关的实现

一、数组Sort排序

升序排序,直接使用Arrays.Sort方法,例如:

代码语言:javascript
AI代码解释
复制
int[] array = {10, 3, 6, 1, 4, 5, 9};
//正序排序
Arrays.sort(array);//会检查数组个数大于286且连续性好就使用归并排序,若小于47使用插入排序,其余情况使用双轴快速排序
System.out.println("升序排序:");
for (int num : array) {
        System.out.println(num);
}

降序排序,对于只输出数组的情况,可以倒叙循环访问,例如:

代码语言:javascript
AI代码解释
复制
//倒序排序
//(1)由于不提供倒排方法,你可以倒叙输出
System.out.println("降序输出:");
for (int i = array.length - 1; i >= 0; i--) {
        System.out.println(array[i]);
}

降序排序,对于需要使用数组 的情况,可以创建一个新的数组,然后倒叙访问赋值,例如:

代码语言:javascript
AI代码解释
复制
//(2)或者创建一个新的数组,倒叙保存到新数组
int[] descArray = new int[array.length];
for (int i = 0; i < array.length; i++) {
        descArray[i] = array[array.length - i - 1];
}
System.out.println("新数组降序输出:");
for (int num : descArray) {
        System.out.println(num);
}

降序排序,可以先将数组转为集合,然后使用Collections.reverse()反转集合,但是对于非引用类型,不可以使用Arrays.asList(),因为int[]会被当作一个类型,而不是数组。

所以可以使用Guava的Ints.asList()方法实现,该转换后的集合,实现了List接口的方法,直接将数组转入内部的数组变量,需要注意它并没有实现数组的操作方法,例如调用add会报错:

转换和排序例如:

代码语言:javascript
AI代码解释
复制
//(3)或者使用Guava来实现
List<Integer> integersList = Ints.asList(array);
Collections.reverse(integersList);//冒泡交换
System.out.println("Guava降序输出:");
for (int num : integersList) {
    System.out.println(num);
}

转后的集合类是Guava中的IntArrayAsList,其类UML图如下:

二、集合Sort排序—包装类

本小节主要是对jdk类库中的包装类排序,例如:Integer、String等,这些类都已经重写了Compare方法,都有默认排序规则,例如对于Integer类型会比较其包装的值类型大小,对于String类型会以长度最小字符串为基准,逐一比较相同位置字符的ASCII码大小,如果都相同则比较字符串的长度。

以Integer为例子,升序排序:

代码语言:javascript
AI代码解释
复制
//Integer集合,正序排序
List<Integer> list = new ArrayList<Integer>(Arrays.asList(10, 3, 6, 1, 4, 5, 9));
Collections.sort(list);
System.out.println("集合正序排序:");
for (Integer num : list) {
        System.out.println(num);
}

返回:

代码语言:javascript
AI代码解释
复制
集合正序排序:
1
3
4
5
6
9
10

降序排序:

代码语言:javascript
AI代码解释
复制
//倒叙排序
Comparator<Integer> reverseComparator = Collections.reverseOrder();
Collections.sort(list, reverseComparator);
System.out.println("集合倒叙排序:");
for (Integer num : list) {
    System.out.println(num);
}

返回:

代码语言:javascript
AI代码解释
复制
集合倒叙排序:
10
9
6
5
4
3
1
三、集合Sort排序—自定义对象

除了两节所描述的情况,我们还会遇到对于自定义类排序的情况,例如我们现在有一个学生对象,想要根据年龄对其进行排序,学生类Student如下:

代码语言:javascript
AI代码解释
复制
public class Student {

    private String name;

    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    /**
     * 为了更好显示数据,我们重写toString()方法.
     * @return 显示变量的字符串
     */
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

(1) 第一种方式,是实现Comparable接口,重写接口方法。

该CompareTo()方法,如果指定的数与参数相等返回0;如果指定的数小于参数返回 -1;如果指定的数大于参数返回 1。

对于排序来讲,你可以认为当返回1时,指定的数和参数会进行交换,而非1时则不变,指定数可以当作原本的数组中靠前的数,而参数可以当作靠后的数,又因为只有靠前数大于靠后数时才返回1,所以大的会被放到后面,此时升序排序(方便记忆)。以此类推,倒序情况则相反。

升序排序,比Student类增加了Comparable接口,并实现升序排序:

代码语言:javascript
AI代码解释
复制
public class StudentAsc implements Comparable<StudentAsc> {
    private String name;

    private Integer age;

    public StudentAsc(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public int compareTo(StudentAsc o) {
        if(null == this.age) {
            return -1;
        }
        if(null == o.getAge()) {
            return 1;
        }
        return this.age.compareTo(o.getAge());
    }

    @Override
    public String toString() {
        return "StudentAsc{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}

方法调用:

代码语言:javascript
AI代码解释
复制
//正序排序,年龄为null时为小
StudentAsc studentWang = new StudentAsc("王小二", 10);
StudentAsc studentZhang = new StudentAsc("张三", 1);
StudentAsc studentGou = new StudentAsc("狗子", 99);
StudentAsc studentZhao = new StudentAsc("赵六", 40);
StudentAsc studentLi = new StudentAsc("李四", null);
List<StudentAsc> studentAscs = new ArrayList<StudentAsc>(Arrays.asList(studentWang, studentZhang, studentGou, studentZhao, studentLi));
Collections.sort(studentAscs);
System.out.println("自定义对象,升序排序:");
for(StudentAsc studentAsc : studentAscs) {
    System.out.println(studentAsc.toString());
}

返回:

代码语言:javascript
AI代码解释
复制
自定义对象,升序排序:
Student{name='李四', age=null}
Student{name='张三', age=1}
Student{name='王小二', age=10}
Student{name='赵六', age=40}
Student{name='狗子', age=99}

降序排序,比Student类增加了Comparable接口,并实现倒序排序:

代码语言:javascript
AI代码解释
复制
public class StudentDesc implements Comparable<StudentDesc> {
    private String name;

    private Integer age;

    public StudentDesc(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public int compare(Integer o1, Integer o2) {
        return o2.compareTo(o1);
    }

    public int compareTo(StudentDesc o) {
        if(null == this.age) {
            return 1;
        }
        if(null == o.getAge()) {
            return -1;
        }
        return o.age.compareTo(this.getAge());
    }

    @Override
    public String toString() {
        return "StudentDesc{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

方法调用:

代码语言:javascript
AI代码解释
复制
//降叙排序,年龄为null时为最大
StudentDesc studentWang = new StudentDesc("王小二", 10);
StudentDesc studentZhang = new StudentDesc("张三", 1);
StudentDesc studentGou = new StudentDesc("狗子", 99);
StudentDesc studentZhao = new StudentDesc("赵六", 40);
StudentDesc studentLi = new StudentDesc("李四", null);
List<StudentDesc> studentAscs = new ArrayList<StudentDesc>(Arrays.asList(studentWang, studentZhang, studentGou, studentZhao, studentLi));
Collections.sort(studentAscs);
System.out.println("自定义对象,降序排序:");
for(StudentDesc studentAsc : studentAscs) {
    System.out.println(studentAsc.toString());
}

返回:

代码语言:javascript
AI代码解释
复制
自定义对象,降序排序:
Student{name='狗子', age=99}
Student{name='赵六', age=40}
Student{name='王小二', age=10}
Student{name='张三', age=1}
Student{name='李四', age=null}

(2)第二种方式,上面实现Comparable接口的方法并不十分灵活,比如对于一个类,在不同的地方需要使用不同的排序,此时再这样做就会显的十分繁琐。因此我们可以通过Collections.sort(List<T> list, Comparator<? super T> c)方法来实现,例子中,我们使用Student类,例子如下:

升序排序:

代码语言:javascript
AI代码解释
复制
//升序排序
Student studentWang = new Student("王小二", 10);
Student studentZhang = new Student("张三", 1);
Student studentGou = new Student("狗子", 99);
Student studentZhao = new Student("赵六", 40);
Student studentLi = new Student("李四", null);
List<Student> students = new ArrayList<Student>(Arrays.asList(studentWang, studentZhang, studentGou, studentZhao, studentLi));
Collections.sort(students, new Comparator<Student>() {
    public int compare(Student o1, Student o2) {
        if(null == o1.getAge()) {
            return -1;
        }
        if(null == o2.getAge()) {
            return 1;
        }
        return o1.getAge().compareTo(o2.getAge());
    }
});
System.out.println("自定义对象,升序排序:");
for(Student student : students) {
    System.out.println(student.toString());
}

返回:

代码语言:javascript
AI代码解释
复制
自定义对象,升序排序:
Student{name='李四', age=null}
Student{name='张三', age=1}
Student{name='王小二', age=10}
Student{name='赵六', age=40}
Student{name='狗子', age=99}

降序排序:

代码语言:javascript
AI代码解释
复制
//降序排序
Student studentWang = new Student("王小二", 10);
Student studentZhang = new Student("张三", 1);
Student studentGou = new Student("狗子", 99);
Student studentZhao = new Student("赵六", 40);
Student studentLi = new Student("李四", null);
List<Student> students = new ArrayList<Student>(Arrays.asList(studentWang, studentZhang, studentGou, studentZhao, studentLi));
Collections.sort(students, new Comparator<Student>() {
    public int compare(Student o1, Student o2) {
        if(null == o1.getAge()) {
            return 1;
        }
        if(null == o2.getAge()) {
            return -1;
        }
        return o2.getAge().compareTo(o1.getAge());
    }
});
System.out.println("自定义对象,降序排序:");
for(Student student : students) {
    System.out.println(student.toString());
}

返回:

代码语言:javascript
AI代码解释
复制
自定义对象,降序排序:
Student{name='狗子', age=99}
Student{name='赵六', age=40}
Student{name='王小二', age=10}
Student{name='张三', age=1}
Student{name='李四', age=null}

至此对数组、包装类集合、自定义集合排序做了总结,希望对大家有所帮助,如果有错误或问题可以留言在下方,敬请指正。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158106.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年7月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
java中sort排序_数据结构算法总结
正序排序:Arrays.sort(array),会检查数组个数大于286且连续性好就使用归并排序,若小于32使用插入排序,其余情况使用快速排序
全栈程序员站长
2022/09/21
4410
Comparable和Comparator兄弟情深?
Comparable和Comparator乍一看像兄弟俩。但是,虽然长得像,使用上却是有很多区别。
烟雨星空
2020/06/16
3420
知识点:Comparable和Comparator接口的区别
Comparable和Comparator都是接口,都是用来比较和排序的,那么他们两个之间到底有这什么样的区别呢?
一缕82年的清风
2022/01/10
5120
【IT领域新生必看】深入浅出Java:揭秘`Comparator`与`Comparable`的神奇区别
在Java编程中,对象排序是一个常见的需求。为了实现对象的排序,Java 提供了两个重要的接口:Comparable和Comparator。对于初学者来说,理解这两个接口的区别及其使用场景,是编写高效和灵活代码的关键一步。本篇文章将详细介绍Comparator与Comparable的定义、用法及其区别,帮助你全面理解这些重要概念。
E绵绵
2024/07/12
2800
java8 stream
1.Stream 简介 Stream 自己不会存储元素。 Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。 Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。 2.Stream 的三个操作步骤  2.1创建Stream /** * 创建 Stream */ @Test public void test1(){ //1。可以通过collection 系列集合提供的 stream()或者parallel
DencyCheng
2022/05/11
5210
【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
4270
【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!
【背诵③】保姆级 | 零基础备赛蓝桥杯Java组| 排序库的使用
Java 提供了多种排序算法和排序库,其中比较常用的是 Arrays.sort() 方法和 Collections.sort() 方法,分别用于对数组和集合进行排序。
命运之光
2024/04/15
2120
集合工具类Collections指南,以及Comparable和Comparator排序详解
文章目录 🍟常用功能 🍕Comparator比较器 🌭Comparable和Comparator两个接口的区别 🥪练习 🌮扩展 🍟常用功能 java.utils.Collections是集合工具类
共饮一杯无
2022/11/28
3710
Java之自定义排序工具类
在项目开发中,经常会遇到需要对一个复杂对象的集合进行规则排序,可能需要根据某一字段排序,也可能需要根据某些字段排序,导致冗余的代码看起来既复杂又繁琐。因此,我们可以通过封装一个通用的工具类,来针对所有的复杂对象进行抽象处理。 这样会使你的代码显得更加具备通用性,并且可适配。
23号杂货铺
2019/09/27
1.9K0
Java之自定义排序工具类
面试官:说一下List排序方法
排序算是比较高频的面试题了,节前面试了的两家公司都有问到排序问题,整理后分享给大家(文末见总结)。
niceyoo
2020/10/19
1.3K0
java_List、Set、Conllections工具类
List接口特点: 1. 它是一个元素存取有序的集合。例如,存元素的顺序是11、22、33。那么集合中,元素的存储就是按照11、22、33的顺序完成的)。 2. 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。 3. 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
咕咕星
2020/08/19
4570
java_List、Set、Conllections工具类
【Java】List、Set、数据结构、Collections
当你用着java里面的容器类很爽的时候,你有没有想过,怎么ArrayList就像一个无限扩充的数组,也好像链表之类的。好用吗?好用,这就是数据结构的用处,只不过你在不知不觉中使用了。
陶然同学
2023/02/27
5320
【Java】List、Set、数据结构、Collections
java——List列表结构的复杂排序
这种列表数据的类型是List<Intger>和List<String>,是简单的数据类型。 可以使用以下的方法排序。
不愿意做鱼的小鲸鱼
2022/09/26
1.3K0
java——List列表结构的复杂排序
集合工具类 Collections:提升集合操作效率
在Java的集合框架中,Collections 是一个包含了许多操作集合的静态方法的工具类。通过使用 Collections 类提供的方法,我们能够更加高效地操作集合,完成一些常见的操作,如添加元素、随机置换、排序等。本文将介绍一些常用的 Collections 类的方法,以及如何在特定情境下应用它们。
IT_陈寒
2023/12/13
4210
Java ArrayList 的不同排序方法
由于其功能性和灵活性,ArrayList是 Java 集合框架中使用最为普遍的集合类之一。ArrayList 是一种 List 实现,它的内部用一个动态数组来存储元素,因此 ArrayList 能够在添加和移除元素的时候进行动态的扩展和缩减。你可能已经使用过 ArrayList,因此我将略过基础部分。如果你对 ArrayList 还不熟悉,你可以参考它的 API 文档,可以很容易理解在 ArrayList 上执行基本的操作。
田维常
2019/08/08
1.5K0
【Java_13】List、Set、Collections
一、List 1. 特点 ① 有序(存取一致) ② 有索引 ③ 可重复 2. 常用方法 ① add(int index, E element) 将指定的元素,添加到该集合中的指定位置上。 ② get(int index) 返回集合中指定位置的元素。 ③ remove(int index) 移除列表中指定位置的元素, 返回的是被移除的元素。 ④ set(int index, E element) 用指定元素替换集合中指定位置的元素,返回值的更新前的元素。 ⑤ 示例
用户8250147
2021/02/04
2790
List排序
在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作。List 排序的常见方法有以下 3 种:
丁D
2022/08/12
7820
String忽略大小写方法compareToIgnoreCase源码及Comparator自定义比较器
String忽略大小写方法compareToIgnoreCase源码及Comparator自定义比较器
oktokeep
2024/10/09
1910
List、Set、数据结构、Collections
数据结构 栈:先进后出 队列:先进先出 数组:查询快,增删慢 链表:查询慢,增删快 红黑树:趋近于平衡树,查询的速度非常快,查询叶子节点最大次数和最小次数不能超过2倍。
全栈程序员站长
2022/06/29
5970
List、Set、数据结构、Collections
Collection 子接口之 Set
一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo()方法或compare()方法,当我们需要对某一个集合实现两种排序方式,比如一个 song 对象中的歌名和歌手名分别采用一种排序方法的话,我们可以重写compareTo()方法和使用自制的Comparator方法或者以两个 Comparator 来实现歌名排序和歌星名排序,第二种代表我们只能使用两个参数版的 Collections.sort().
黑洞代码
2021/01/28
7260
相关推荐
java中sort排序_数据结构算法总结
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档