你能说出几种集合的排序方式?

面试回答

Java.util 包中的 List 接口继承了 Collection 接口,用来存放对象集合,所以对这些对象进行排序的时候,要么让对象类自己实现同类对象的比较,要么借助比较器进行比较排序。

举例:学生实体类,包含姓名和年龄属性,比较时先按姓名升序排序,如果姓名相同则按年龄升序排序。

实现 Comparable

第一种:实体类自己实现 Comparable 接口比较。

@Data
@Builder
@ToString
public class Student implements Comparable<Student> {

    private String name;
    private int age;


    @Override
    public int compareTo(Student o) {
        int flag=this.name.compareTo(o.name);
        if (flag==0){
            flag=this.age-o.age;
        }
        return flag;
    }

    public static void main(String[] args) {
        Student stu1=Student.builder().name("bb").age(19).build();
        Student stu2=Student.builder().name("aa").age(19).build();
        Student stu3=Student.builder().name("bb").age(17).build();
        List<Student> list= Arrays.asList(stu1,stu2,stu3);
        for (Student stu:list){
            System.out.println(stu);
        }
        System.out.println("--------------");
        Collections.sort(list);
        for (Student stu:list){
            System.out.println(stu);
        }
    }
    
}

输出如下:

Student(name=bb, age=19)
Student(name=aa, age=19)
Student(name=bb, age=17)
--------------
Student(name=aa, age=19)
Student(name=bb, age=17)
Student(name=bb, age=19)

借助 Comparator

第二种:借助比较器进行排序。

package com.chiyi.test;

import lombok.Builder;
import lombok.Data;
import lombok.ToString;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@Data
@Builder
@ToString
public class Student  {

    private String name;
    private int age;

    public static void main(String[] args) {
        Student stu1=Student.builder().name("bb").age(19).build();
        Student stu2=Student.builder().name("aa").age(19).build();
        Student stu3=Student.builder().name("bb").age(17).build();
        List<Student> list= Arrays.asList(stu1,stu2,stu3);
        for (Student stu:list){
            System.out.println(stu);
        }
        System.out.println("--------------");
        list.sort(Comparator.comparing(Student::getName)
                .thenComparingInt(Student::getAge));
        for (Student stu:list){
            System.out.println(stu);
        }
    }

}

借助 Stream

第三种:借助 Stream 进行排序,借助 Stream 的 API,底层还是通过 Comparable 实现的。

@Data
@Builder
@ToString
public class Student {

    private String name;
    private int age;

    public static void main(String[] args) {
        Student stu1 = Student.builder().name("bb").age(19).build();
        Student stu2 = Student.builder().name("aa").age(19).build();
        Student stu3 = Student.builder().name("bb").age(17).build();
        List<Student> list = Arrays.asList(stu1, stu2, stu3);
        for (Student stu : list) {
            System.out.println(stu);
        }
        System.out.println("--------------");
        List<Student> list2 = list.stream().sorted((Comparator.comparing(Student::getName)
                .thenComparingInt(Student::getAge))).collect(Collectors.toList());
        for (Student stu : list2) {
            System.out.println(stu);
        }
    }
}

知识扩展

有了 Comparable 为什么还需要 Comparator?

Comparable 用于使某个类具备可排序能力。如之前的 Student 类,实现该接口后覆盖其 compareTo 方法,即可具备可排序的能力。

但是仍然存在一些二方库的类没有实现 Comparable,但是调用方法也需要比较的,此时就需要使用 Comparator 接口。

Comparator 是一个比较器接口,可以用来给不具备排序能力的对象进行排序。如上述代码中对不具备排序能力的 Student 进行排序。

compareTo 和 equals 的使用场景有何区别?

compareTo 常用于排序和 BigDecimal 等数值的比较。

equals 则是常用于业务语义中两个对象是否相同,如 String 常常通过 equals 来比较是否字面意义相同。

既然 Set 是无序的,还怎么排序?

这里说的是两个语境的不同,Set 的无序,指的是插入顺序是无序的。虽然 Set 的插入顺序是无序的,Set 也可以基于 SortedSet 要求对象实现 Comparable 来对 Set 中的元素进行排序。

Set 真的是插入无序的吗?

并不是,Set 有一个实现类是 LinkedHashSet,它引入了 LinkedHashMap,通过双向链表记录了每个 node 的插入顺序和查询顺序(可选),以此来达到 Set 的插入有序性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java语言中可以使用以下几种方式排序List集合: 1. 实现Comparable接口:让集合元素实现Comparable接口,并重写compareTo方法。使用Collections.sort()方法对集合排序。 2. 实现Comparator接口:使用Comparator接口的实现类来定义排序规则。使用Collections.sort(List, Comparator)方法对集合排序。 3. Java 8 Stream API:使用Stream API的sorted方法对集合排序。 4. 使用数组排序:将集合转换成数组,使用Arrays.sort()方法对数组排序,最后再将数组转换回集合。 ### 回答2: Java语言中的List集合可以使用多种方式进行排序,以下列举了几种常见的方法: 1. 使用Collections.sort()方法:通过调用Collections类的sort()方法,可以按照集合元素的自然顺序进行排序。例如: ```java List<Integer> list = new ArrayList<>(); // 添加元素到list中 Collections.sort(list); ``` 2. 使用Comparator接口:通过实现Comparator接口,可以定义自定义的排序规则。例如: ```java List<String> list = new ArrayList<>(); // 添加元素到list中 Collections.sort(list, new Comparator<String>() { @Override public int compare(String s1, String s2) { return s1.compareTo(s2); } }); ``` 3. 使用lambda表达式:Java 8及以上版本支持使用lambda表达式进行简洁的排序操作。例如: ```java List<String> list = new ArrayList<>(); // 添加元素到list中 list.sort((s1, s2) -> s1.compareTo(s2)); ``` 4. 使用Stream API:Java 8及以上版本提供了Stream API,可以方便地对集合中的元素进行排序。例如: ```java List<Integer> list = new ArrayList<>(); // 添加元素到list中 List<Integer> sortedList = list.stream().sorted().collect(Collectors.toList()); ``` 以上是Java语言中List集合排序的几种常见方式,可以根据具体的需求选择适合的方法进行排序操作。 ### 回答3: 在Java语言中,对List集合进行排序的几种方式如下: 1. 使用Collections.sort()方法:可以通过调用Collections类的sort()方法对List集合进行排序。方法原型为: ```java public static <T extends Comparable<? super T>> void sort(List<T> list) ``` 此方法会使用集合元素的自然顺序进行排序。 2. 实现Comparable接口:若集合中的元素是自定义的对象,可以让对象实现Comparable接口,并重写其中的compareTo()方法来指定对象之间的比较规则。然后调用Collections.sort()方法对List集合进行排序。 3. 使用Comparator比较器:使用Comparator接口的实现类来指定元素的比较规则。可以通过创建Comparator的实例,并重写compare()方法来实现自定义的比较规则。然后再调用Collections.sort()方法并传入Comparator参数进行排序。 4. 使用lambda表达式:在Java 8及以后的版本,可以使用lambda表达式对List集合进行排序。可以通过使用List的sort()方法,将Comparator接口的实现作为参数传入进行排序。例如: ```java list.sort((a, b) -> a.compareTo(b)); ``` 5. 使用Stream API:在Java 8及以后的版本,可以使用Stream API对List集合进行排序。通过调用List的stream()方法,再调用sorted()方法来进行排序。对于自定义对象,可以重写Comparable接口或使用Comparator指定排序规则。 总之,Java语言中对List集合进行排序可以通过调用Collections.sort()方法、实现Comparable接口、使用Comparator比较器、使用lambda表达式或使用Stream API等方式来实现。具体选择哪种方式取决于业务需求和个人偏好。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

协享科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值