Java 比较器的用法

Posted elairs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 比较器的用法相关的知识,希望对你有一定的参考价值。

  第一次写博客,正好在回顾Java的时候用到了比较器,记录一下使用的方法。

  Java比较器多用于对象数组的排序,主要用到comparable和comparator接口

 

  1、使用comparable接口

  首先将需要实现排序对象的类实现comparable接口,实现后覆写comparaTo(T other)方法,在comparaTo方法中写出比较规则,最后调用java.utils.Arrays.sort()方法传入需要比较的对象数组即可排序。

  测试如下:

 1 import java.util.Arrays;
 2 
 3 public class Main 
 4 
 5     public static void main(String[] args) 
 6 
 7         Student[] arr = new Student[3];
 8         arr[0] = new Student(3);
 9         arr[1] = new Student(2);
10         arr[2] = new Student(1);
11         for( Student a : arr )
12             System.out.print(a+" ");
13         Arrays.sort(arr);
14         System.out.println();
15         for( Student a : arr )
16             System.out.print(a+" ");
17     
18 
19 
20 class Student implements Comparable<Student>
21 
22     int number;
23 
24     public Student(int aNumber)
25         this.number = aNumber;
26     
27 
28     public int compareTo(Student o)//对象自身与o比较,返回1的话,被比较的对象将会排在前面。
29         if(this.number > o.number)
30             return 1;
31         else if(this.number == o.number)
32             return 0;
33         else
34             return -1;
35     
36 
37     public String toString()
38         return String.valueOf(number);
39     
40 
41 

运行结果为:

  3 2 1

  1 2 3

 

  注:

    比较时,若想要从大到小排序,将排序方式中的1更换成-1,-1更换成1即可。

=======================================

  2、使用comparator接口 

  有时,在设计Student类时没有考虑到实现Comparable接口,可自己编写一个比较器类.

  创建一个比较器类,实现comparator<T>接口,覆写compare(T o1,T o2)方法,最后在调用Arrays.sort()时传入要排序的数组和比较器类即可

  测试如下:

 1 package practice;
 2 import java.util.Arrays;
 3 import java.util.Comparator;
 4 
 5 public class Main 
 6 
 7     public static void main(String[] args) 
 8 
 9         Student[] arr = new Student[3];
10         arr[0] = new Student(1,3);
11         arr[1] = new Student(3,5);
12         arr[2] = new Student(2,5);
13         for( Student a : arr )
14             System.out.print(a+"\t");
15         Arrays.sort(arr,new StudentComparator()); //传入数组和比较器类
16         System.out.println();
17         for( Student a : arr )
18             System.out.print(a+"\t");
19     
20 
21 
22 class Student
23 
24     int number; //学号
25     int score; //分数
26 
27     public Student(int aNumber,int aScore)
28         this.number = aNumber;
29         this.score = aScore;
30     
31 
32     public String toString()
33         return number+"号分数:"+score;
34     
35 
36 
37 
38 class StudentComparator implements Comparator<Student>
39 
40     public int compare(Student o1, Student o2)  //在编写时添加了新比较规则,分数高的在前,若分数相同,学号大的在前。
41         if(o1.score > o2.score)
42             return -1;
43         else if(o1.score < o2.score)
44             return 1;
45         else
46             if(o1.number > o2.number)
47                 return -1;
48             else if(o1.number < o2.number)
49                 return 1;
50             else
51                 return 0;
52         
53     
54 
55 

  运行结果:

  1号分数:3  3号分数:5  2号分数:5
  3号分数:5  2号分数:5  1号分数:3

 上面的方法也可以像本次测试一样,修改比较规则,实现不同排序效果。

=======================================

   如果想为集合类排序,与第二种方法类似,在调用Collections.sort(st,new ComparatorSort())时传入集合和比较器即可。

 

以上是关于Java 比较器的用法的主要内容,如果未能解决你的问题,请参考以下文章

《Java8实战》 - 读书笔记 - Lambda 表达式的组合用法

java中equals与==的用法比较

JAVA Comparator 接口排序用法

2020了你还不会Java8新特性?收集器比较器用法详解及源码剖析

Java:Memory Analyzer Tool (MAT) 用法:比较两个 heapdump

java compareTo() 用法注意点