当前位置:   article > 正文

Java Sort 方法的使用(包含Arrays.sort(),Collections.sort()以及Comparable,Comparator的使用 )_java排序方法collections.sort comparator 多个字段

java排序方法collections.sort comparator 多个字段

目录

Comparable && Comparator的使用:

Comparable:

Comparator:

Arrays.sort()的使用:

升序排序:

 降序排序:

 自定义排序方法:


在日常的刷题或开发中,很多时候我们需要对数据进行排序,以达到我们的预期效果的作用。那么这些排序方法具体怎么实现和使用呢?本文就来好好缕一缕,总结一下这些方法:

Comparable && Comparator的使用:

Comparable:

当我们对类中的对象进行比较时,要保证对象时可比较的,这时我们就需要用到Comparable 或 Comparator接口,然后重写里面的compareTo()方法。假设我们有一个学生类,默认需要按照学生的年龄age排序,具体实现如下:

  1. class Student implements Comparable<Student>{
  2. private int id;
  3. private int age;
  4. private String name;
  5. public Student(int id, int age, String name) {
  6. this.id = id;
  7. this.age = age;
  8. this.name = name;
  9. }
  10. @Override
  11. public int compareTo(Student o) {
  12. //降序
  13. //return o.age - this.age;
  14. //升序
  15. return this.age - o.age;
  16. }
  17. public int getId() {
  18. return id;
  19. }
  20. public void setId(int id) {
  21. this.id = id;
  22. }
  23. public int getAge() {
  24. return age;
  25. }
  26. public void setAge(int age) {
  27. this.age = age;
  28. }
  29. public String getName() {
  30. return name;
  31. }
  32. public void setName(String name) {
  33. this.name = name;
  34. }
  35. @Override
  36. public String toString() {
  37. return "Student{" +
  38. "id=" + id +
  39. ", age=" + age +
  40. ", name='" + name + '\'' +
  41. '}';
  42. }
  43. }

这里说一下  public int compareTo(Student o) 方法,它返回三种 int 类型的值: 负整数 ,正整数:

返回值含义
正整数当前对象的值 > 比较对象的值,升序排序
当前对象的值  比较对象的值,不变
负整数当前对象的值 < 比较对象的值,降序排序

测试:

  1. public class SortTest {
  2. public static void main(String[] args) {
  3. List<Student> list = new ArrayList<>();
  4. list.add(new Student(103,25,"关羽"));
  5. list.add(new Student(104,21,"张飞"));
  6. list.add(new Student(108,18,"刘备"));
  7. list.add(new Student(101,32,"袁绍"));
  8. list.add(new Student(109,36,"赵云"));
  9. list.add(new Student(103,16,"曹操"));
  10. System.out.println("排序前:");
  11. for(Student student : list){
  12. System.out.println(student.toString());
  13. }
  14. System.out.println("默认排序后:");
  15. Collections.sort(list);
  16. for(Student student : list){
  17. System.out.println(student.toString());
  18. }
  19. }
  20. }

运行结果:

  1. 排序前:
  2. Student{id=103, age=25, name='关羽'}
  3. Student{id=104, age=21, name='张飞'}
  4. Student{id=108, age=18, name='刘备'}
  5. Student{id=101, age=32, name='袁绍'}
  6. Student{id=109, age=36, name='赵云'}
  7. Student{id=103, age=16, name='曹操'}
  8. 默认排序后:
  9. Student{id=103, age=16, name='曹操'}
  10. Student{id=108, age=18, name='刘备'}
  11. Student{id=104, age=21, name='张飞'}
  12. Student{id=103, age=25, name='关羽'}
  13. Student{id=101, age=32, name='袁绍'}
  14. Student{id=109, age=36, name='赵云'}

Comparator:

Comparator的两种使用方法:

  • Collections.sort(list,Comparator<T>);
  • list.sort(Comparator<T>);

这个时候需求又来了,默认是用 age 排序,但是有的时候需要用 id 来排序怎么办? 这个时候比较器 :Comparator 就排上用场了:

  1. //自定义排序:使用匿名内部类,实现Comparator接口,重写compare方法
  2. Collections.sort(list, new Comparator<Student>() {
  3. @Override
  4. public int compare(Student o1, Student o2) {
  5. return o1.getId() - o2.getId();
  6. }
  7. });
  8. //自定义排序2
  9. list.sort(new Comparator<Student>() {
  10. @Override
  11. public int compare(Student o1, Student o2) {
  12. return o1.getId() - o2.getId();
  13. }
  14. });

compare(Student o1, Student o2) 方法的返回值跟 Comparable<> 接口的 compareTo(Student o) 方法返回值意思相同 

 运行结果:

  1. 自定义ID排序后:
  2. Student{id=101, age=32, name='袁绍'}
  3. Student{id=103, age=16, name='曹操'}
  4. Student{id=103, age=25, name='关羽'}
  5. Student{id=104, age=21, name='张飞'}
  6. Student{id=108, age=18, name='刘备'}
  7. Student{id=109, age=36, name='赵云'}

源码:

  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.Comparator;
  4. import java.util.List;
  5. class Student implements Comparable<Student>{
  6. private int id;
  7. private int age;
  8. private String name;
  9. public Student(int id, int age, String name) {
  10. this.id = id;
  11. this.age = age;
  12. this.name = name;
  13. }
  14. @Override
  15. public int compareTo(Student o) {
  16. //降序
  17. //return o.age - this.age;
  18. //升序
  19. return this.age - o.age;
  20. }
  21. public int getId() {
  22. return id;
  23. }
  24. public void setId(int id) {
  25. this.id = id;
  26. }
  27. public int getAge() {
  28. return age;
  29. }
  30. public void setAge(int age) {
  31. this.age = age;
  32. }
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. @Override
  40. public String toString() {
  41. return "Student{" +
  42. "id=" + id +
  43. ", age=" + age +
  44. ", name='" + name + '\'' +
  45. '}';
  46. }
  47. }
  48. public class SortTest {
  49. public static void main(String[] args) {
  50. List<Student> list = new ArrayList<>();
  51. list.add(new Student(103,25,"关羽"));
  52. list.add(new Student(104,21,"张飞"));
  53. list.add(new Student(108,18,"刘备"));
  54. list.add(new Student(101,32,"袁绍"));
  55. list.add(new Student(109,36,"赵云"));
  56. list.add(new Student(103,16,"曹操"));
  57. System.out.println("排序前:");
  58. for(Student student : list){
  59. System.out.println(student.toString());
  60. }
  61. System.out.println("默认排序后:");
  62. Collections.sort(list);
  63. for(Student student : list){
  64. System.out.println(student.toString());
  65. }
  66. //自定义排序:使用匿名内部类,实现Comparator接口,重写compare方法
  67. Collections.sort(list, new Comparator<Student>() {
  68. @Override
  69. public int compare(Student o1, Student o2) {
  70. return o1.getId() - o2.getId();
  71. }
  72. });
  73. System.out.println("自定义ID排序后:");
  74. for(Student student : list){
  75. System.out.println(student.toString());
  76. }
  77. //自定义排序2
  78. list.sort(new Comparator<Student>() {
  79. @Override
  80. public int compare(Student o1, Student o2) {
  81. return o1.getId() - o2.getId();
  82. }
  83. });
  84. }
  85. }

Arrays.sort()的使用:

升序排序

1.正常排序一个数组:Arrays.sort(int [] a);

我们看一下源码:

  1. public static void sort(int[] a) {
  2. DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
  3. }

本质上还是用到了快排,同时默认时从小到大进行排序的,具体实现:

  1. public static void main(String[] args) {
  2. //1.Arrays.sort(int[] a) 默认从小到达排序
  3. int[] a = new int[]{10,2,7,8,9,15,7};
  4. System.out.println("默认时从小到大排序:");
  5. Arrays.sort(a);
  6. for(int x : a) System.out.print(x + " ");
  7. }

运行结果:

  1. 默认时从小到大排序:
  2. 2 7 7 8 9 10 15

 2.在一定区间内排序数组:Arrays.sort(int[] a, int fromIndex, int toIndex)

->规则为从fromIndex<= a数组 <toIndex,左闭右开

  1. public static void main(String[] args) {
  2. //2.Arrays.sort(int[] a, int fromIndex, int toIndex)
  3. //规则为从fromIndex<= a数组 <toIndex
  4. int[] a = new int[]{2,5,4,1,19,3,2};
  5. Arrays.sort(a,1,4);
  6. for(int x : a) System.out.print(x + " ");
  7. }

 降序排序

实现方法:Collections.reverseOrder()

public static <T> void sort(T[] a,int fromIndex, int toIndex,  Comparator<? super T> c)

要实现降序排序,得通过包装类型的数组来实现,基本数据类型数组是不行的:

正确用法:

  1. //2.java自带的Collections.reverseOrder() 降序排序数组
  2. System.out.println("java自带的Collections.reverseOrder():");
  3. Integer[] integers = new Integer[]{10, 293, 35, 24, 64, 56};
  4. Arrays.sort(integers, Collections.reverseOrder());
  5. for (Integer integer : integers) System.out.print(integer + " ");

 运行结果:

  1. java自带的Collections.reverseOrder():
  2. 293 64 56 35 24 10

 自定义排序方法:

自定义排序方法,需要实现java.util.Comparetor 接口中的compare方法
  1. //3.自定义排序方法,实现java.util.Comparetor 接口中的compare方法
  2. Integer[] integers2 = new Integer[]{10, 293, 35, 24, 64, 56};
  3. Arrays.sort(integers2, new Comparator<Integer>() {
  4. @Override
  5. public int compare(Integer o1, Integer o2) {
  6. return o2.compareTo(o1);
  7. }
  8. });
  9. System.out.println("自定义排序方法:");
  10. for (int x : integers2) System.out.print(x + " ");

运行结果:

  1. 自定义排序方法:
  2. 293 64 56 35 24 10

 同时,我们可以用lambda表达是简化书写:

  1. //4.lambda表达式简化书写
  2. Integer[] integers3 = new Integer[]{10, 293, 35, 24, 64, 56};
  3. Arrays.sort(integers3, (o1, o2) -> {
  4. return o2 - o1;
  5. });
  6. System.out.println("lambda表达式简化书写:");
  7. for (int x : integers3) System.out.print(x + " ");

运行结果:

  1. lambda表达式简化书写:
  2. 293 64 56 35 24 10

源码:

  1. import java.util.*;
  2. public class sortTest {
  3. public static void main1(String[] args) {
  4. //1.Arrays.sort(int[] a) 默认从小到达排序
  5. int[] a = new int[]{10,2,7,8,9,15,7};
  6. System.out.println("默认时从小到大排序:");
  7. Arrays.sort(a);
  8. for(int x : a) System.out.print(x + " ");
  9. }
  10. public static void main2(String[] args) {
  11. //2.Arrays.sort(int[] a, int fromIndex, int toIndex)
  12. //规则为从fromIndex<= a数组 <toIndex
  13. int[] a = new int[]{2,5,4,1,19,3,2};
  14. Arrays.sort(a,1,4);
  15. for(int x : a) System.out.print(x + " ");
  16. }
  17. public static void main3(String[] args) {
  18. /* //1.实现降序排序,基本的数据类型数组是不行的
  19. int[] a = new int[]{10,293,35,24,64,56};
  20. Arrays.sort(a,Collections.reverseOrder());
  21. for(int x : a) System.out.println(x + " ");*/
  22. //2.java自带的Collections.reverseOrder() 降序排序数组
  23. System.out.println("java自带的Collections.reverseOrder():");
  24. Integer[] integers = new Integer[]{10, 293, 35, 24, 64, 56};
  25. Arrays.sort(integers, Collections.reverseOrder());
  26. for (Integer integer : integers) System.out.print(integer + " ");
  27. System.out.println();
  28. System.out.println("===================================");
  29. //3.自定义排序方法,实现java.util.Comparetor 接口中的compare方法
  30. Integer[] integers2 = new Integer[]{10, 293, 35, 24, 64, 56};
  31. Arrays.sort(integers2, new Comparator<Integer>() {
  32. @Override
  33. public int compare(Integer o1, Integer o2) {
  34. return o2.compareTo(o1);
  35. }
  36. });
  37. System.out.println("自定义排序方法:");
  38. for (int x : integers2) System.out.print(x + " ");
  39. System.out.println();
  40. System.out.println("===================================");
  41. //4.lambda表达式简化书写
  42. Integer[] integers3 = new Integer[]{10, 293, 35, 24, 64, 56};
  43. Arrays.sort(integers3, (o1, o2) -> {
  44. return o2 - o1;
  45. });
  46. System.out.println("lambda表达式简化书写:");
  47. for (int x : integers3) System.out.print(x + " ");
  48. }
  49. }

 补充,二维数组的排序:通过实现Comparator接口来自定义排序二维数组,以下面为例:

  1. import java.util.Arrays;
  2. import java.util.Comparator;
  3. class Cmp implements Comparator<int[]>{
  4. @Override
  5. public int compare(int[] o1, int[] o2) {
  6. return o1[0] - o2[0];
  7. }
  8. }
  9. public class Sort {
  10. public static void main123(String[] args) {
  11. int[][] res = new int[][]{
  12. {3,6,7,8},
  13. {2,3,65,7},
  14. {1,4,5,78},
  15. {6,1,2,4}
  16. };
  17. //自定义排序二维数组,这里是按照每行第一个数字进行排序
  18. Arrays.sort(res,new Cmp());
  19. for(int i = 0;i < res.length;i++){
  20. for(int j = 0;j < res[0].length;j++){
  21. System.out.print(res[i][j] + " ");
  22. }
  23. System.out.println();
  24. }
  25. }
  26. }

运行结果:

好啦~本文到这里也是接近尾声了,希望有帮助到你,整理不易,希望多多三联支持呀~

结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/720452
推荐阅读
相关标签
  

闽ICP备14008679号