又到了一周的整理日了,这周萧然过的真懵逼啊,感觉啥也没干,就知道给了个需求,写代码,改了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.sort
或Arrays.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.sort
或Arrays.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