集合或数组按照元素的指定字段排序

本文深入探讨了Java中集合排序的多种方法,包括自然排序、定制排序和利用Stream API进行排序,提供了详细的代码示例,适合Java开发者学习和参考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

又到了一周的整理日了,这周萧然过的真懵逼啊,感觉啥也没干,就知道给了个需求,写代码,改了n次,最后还是不行。最终找了我认识的一个大哥,人家花了10分钟给我解决了。真打脸,不过人总是慢慢成长嘛,嘿嘿。

不知道大家有没有遇到这样一个问题,你从数据库查询数据后得到一个集合,你经过处理后,想用集合中元素的某个字段进行排序,该怎么办呢?

方法一自然排序和定制排序
这么一说是不是感觉恍然大悟,哈哈,我当时准备面试的时候还整理过这个知识点,奉上链接:自然排序和定制排序
尽管写过了,但是还是在这里搞一遍吧

这里先说我们平时用的两个排序方法:
Collections.sort()Arrays.sort()分别用来给集合和数组排序。我们可以用这个给String类型排序,但是如果给我们定义的实体类型排序会怎么样呢?
结果就是报错。为什么可以给String排序,而我们定义的实体类型却不可以呢? 因为String的底层实现了Comparable接口。所以我们也可以实现去解决问题。

① 自然排序

  • Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序
  • 实现Comparable的类必须实现 compareTo(Object obj) 方法,两个对象即通过compareTo(Object obj)方法的返回值来比较大小。如果当前对象this大 于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回 负整数,如果当前对象this等于形参对象obj,则返回零。
  • 实现Comparable接口的对象列表(和数组)可以通过 Collections.sortArrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
class Student implements Comparable { 
   private String name;
	private Integer age;

  @Override 
  public int compareTo(Object o) { 
  	   //下面那一片代码都可以用注释这个代替,因为age可以直接比较大小
  	   //为了写的更详细,所以展开弄得
  	   //return this.age.compareTo(o.getAge());
    if(o instanceof Student) { 
      Student other = (Student) o; 
      if (this.age > other.age) {
        return 1; 
      } else if (this.age < other.age) { 
        return -1;
      } 
      return 0;
     } 
     throw new RuntimeException("输入的数据类型不一致");
   } //构造器、getter、setter、toString()方法略
}

②定制排序

  • 当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator的对象来排序,强行对多个对象进行整体排序的比较
  • 重写compare(Object o1,Object o2)方法,比较o1和o2的大小:如果方法返 回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示 o1小于o2
  • 可以将 Comparator传递给 sort方法(如 Collections.sortArrays.sort), 从而允许在排序顺序上实现精确控制。
public static void main(String[] args) {
		
		TestA testA1 = new TestA("老张", 3);
		TestA testA2 = new TestA("老李", 1);
		TestA testA3 = new TestA("老王", 2);
		List<TestA> list  = new ArrayList<>();
		list.add(testA1);
		list.add(testA2);
		list.add(testA3);
		System.out.println("排序前--:"+list.toString());
		Collections.sort(list, new Comparator<TestA>() {
            @Override
            public int compare(TestA o1, TestA o2) {
                //升序
                return o1.getAge().compareTo(o2.getAge());
            }
        });
		System.out.println("升序排序后--:"+list.toString());
		
		Collections.sort(list, new Comparator<TestA>() {
            @Override
            public int compare(TestA o1, TestA o2) {
                //降序
                return o2.getAge().compareTo(o1.getAge());
            }
        });
		System.out.println("降序排序后--:"+list.toString());
		
	}

方法二:Stream
如果你觉得定制排序和自然排序有点复杂,那就快点看过来,感受一下流Stream的强大之处吧。
二话不说,直接上代码,一看就懂有没有?

/**
*  按照年龄正序
*/
personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());
 
/**
*  按照年龄倒序 reversed()
*/
 personList.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());
 
/**
* 如果需要多条件排序,thenComparing(),对于排序完的结果还可以接着操作
*先按照年龄排序,再按照名称排序
*/
List<Person> collect = personList.stream()
.sorted(Comparator.comparing(Person::getAge).thenComparing(Comparator.comparing(Person::getName)))
.collect(Collectors.toList());

本文就说这些,萧然虽然很小白,但是会慢慢变厉害的,如果觉得文章对你有用,点个赞鼓励鼓励我,哈哈。在这奉上参考的链接:
https://blog.csdn.net/qq_39366175/article/details/79449178
https://blog.csdn.net/sinat_27115575/article/details/103032294

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值