集合排序相关使用

本文详细介绍了Java中集合排序的内部排序和外部排序,包括原始类型和自定义类型的排序方法。内部排序如Collections.sort()直接修改原集合,外部排序如StreamApi则生成新的排序集合。对于自定义类型,通过Comparator进行比较排序。Java 8的lambda表达式使得排序更加简洁。总结了各种排序场景下的实现方式和注意事项。
摘要由CSDN通过智能技术生成

最近经常会用到集合排序,现在总结一下,方便以后复用。

首先理解内部排序和外部排序。

  1. 内部排序是在原来的集合上进行的操作,无需新对象接收。
  2. 外部排序对原来的集合不进行操作,生成一个新的排序好的对象。

一、集合内的元素是Integer,String等Java的原生类型

1.内部排序

List<Integer> integers = Lists.newArrayList(5, 2, 6, 1, 8, 3, 9, 4);
List<String> strings = Lists.newArrayList("1", "15", "20", "11", "10", "55");
Collections.sort(integers);
Collections.sort(strings);
System.out.println(integers);
System.out.println(strings);
//打印结果
[1, 2, 3, 4, 5, 6, 8, 9]
[1, 10, 11, 15, 20, 55]

// 默认升序,如需降序可以这样写
Collections.sort(integers,Collections.reverseOrder());
// 这样也可以,不过这个Comparator.reverseOrder()底层还是调用的上面那个方法
Collections.sort(integers,Comparator.reverseOrder());

//如果你的jdk版本在1.8以上了可以直接用以下方式
integers.sort(Comparator.naturalOrder());
strings.sort(Comparator.naturalOrder());
//打印结果默认升序,降序使用以下方式
integers.sort(Comparator.reverseOrder());
strings.sort(Comparator.reverseOrder());

Collection.sort()方法是一个内部排序的方法,我对内部排序的理解就是,在原来的对象上面进行排序,与外部排序不同的是不需要一个新的对象进行接收。这个方法排序的集合的内部元素需要实现Comparable接口

2.外部排序

List<Integer> integers = Lists.newArrayList(5, 2, 6, 1, 8, 3, 9, 4);
List<String> strings = Lists.newArrayList("1", "15", "20", "11", "10", "55");
List<Integer> a1 = integers.stream().sorted().collect(Collectors.toList());
List<String> a2 = strings.stream().sorted().collect(Collectors.toList());
System.out.println(a1 );
System.out.println(a2);
//打印结果
[1, 2, 3, 4, 5, 6, 8, 9]
[1, 10, 11, 15, 20, 55]

// 默认升序,如需降序可以这样写
List<Integer> a1 = integers.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());

采用的是Java8中的StreamApi,流的方式,是一种外部排序,需要对象来接收,很灵活方便,sorted方法中可以自己返回一个自定义的Comparator比较器进行自定义排序。排序只是StreamApi的冰山一角。

二、集合内的元素是自定义类型

public class User { //简单的User类
    private String name;
    private Integer age;
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}

1.内部排序

List<User> users = Lists.newArrayList(
  new User("张三", 16)
, new User("李四", 21)
, new User("王五", 15)
, new User("赵六", 14));
users.sort(Comparator.comparing(User::getAge));
//打印结果
name=赵六, age=14
name=王五, age=15
name=张三, age=16
name=李四, age=21
//默认升序,降序使用以下方式
users.sort(Comparator.comparing(User::getAge).reversed());

//上面这种方式不好理解的话,下面这种方式就是上面那种方式的解读。
users.sort(new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                if (o1.getAge()> o2.getAge()){
                    return 1;
                }
                if (o1.getAge()==o2.getAge()){
                    return 0;
                }
                
                return -1;
                
            }
        });

2.外部排序

List<User> users = Lists.newArrayList(
  new User("张三", 16)
, new User("李四", 21)
, new User("王五", 15)
, new User("赵六", 14));
List<User> collect = users.stream()
                .sorted(Comparator.comparing(User::getAge))
                .collect(Collectors.toList());
//打印结果
name=赵六, age=14
name=王五, age=15
name=张三, age=16
name=李四, age=21

//默认升序降序可以使用以下方式
List<User> collect = users.stream()
                .sorted(Comparator.comparing(User::getAge).reversed())
                .collect(Collectors.toList());

总结

根据自己的需求选择内排外排,注意内排会影响原集合中的元素顺序。排序的方式应该还有,但这些已经够用了。简单的排序使用集合自带的sort()方法足以,如果有逻辑的进行排序还是建议使用StreamApi,他不止能排序,去学习一下会发现很多惊喜。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值