Java中比较器的结构方法
在java对象数组的比较经常涉及,处理方法有两种:
- 继承comparable接口,并实现compareTo()方法
- 定义一个单独的对象比较器,继承自己Comparator接口,实现compare()方法
1.Comparable 简介
Comparable 是排序接口。 若实现了一个类别Comparable接口意味着这种支持排序。 即然实现Comparable假设界面类别支持排序存在实现Comparable接口类对象List列表(或数组)List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。 另外,实现Comparable接口类对象可用作有序映射TreeMap)键或有序集合(TreeSet)不需要指定比较器中的元素。
1.1 Comparable 定义
Comparable 界面只包含一个函数,其定义如下: package java.lang; import java.util.*;
public interface Comparable { public int compareTo(T o); } 说明:假设我们通过 x.compareTo(y) 来比较x和y大小。如果回到负数,就意味着x比y小零意味着零x等于y返回正数意味着x大于y”。
2.Comparator 简介
Comparator 是比较器接口。 我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);然后,我们可以建立一个这种比较器来排序。这个比较器只需要实现Comparator接口就够了。也就是说,我们可以通过实现Comparator新建类比较器,然后通过比较器对类进行排序。
2.1 Comparator 定义
Comparator 界面仅包括两个函数,其定义如下:
package java.util;
public interface Comparator {
int compare(T o1, T o2); boolean equals(Object obj);
} 说明: 若要实现一个类Comparator接口:必须实现compareTo(T o1, T o2) 函数,但不能实现 equals(Object obj) 函数。 为什么不能实现? equals(Object obj) 函数呢? 因为默认已经实现了任何类别equals(Object obj)的。 Java所有的类都是继承的java.lang.Object,在Object.java中实现了equals(Object obj)函数;因此,所有其他类别也相当于实现了函数。 int compare(T o1, T o2) 是“比较o1和o2的大小。返回负数意味着o1比o二小;返回零意味着零o1等于o2.返回正数意味着o1大于o2”。
3.Comparator 和 Comparable 比较
Comparable是排序接口;如果实现了一个类别Comparable接口意味着这种支持排序。
而Comparator是比较器;如果需要控制某一类的顺序,可以建立这类比较器进行排序。
不难发现:Comparable相当于内部比较器Comparator相当于外部比较器。
实例代码
方法1 class Student implement Comparable{ private String name; private double score; public Student(String name,double score){ this.name = name; this.score = score; } public double getScore(){ return this.score; } @Override public String toString() { return “姓名:” this.name ,分数: this.score; } public int compareTo(Student S){ If(this.score > s.score) return 1; Else if(this.score < s.score) return -1 Else return 0; } }
Main中应用Collections.sort(list);调用排序 方法2 class Student { private String name; private double score; public Student(String name,double score){ this.name = name; this.score = score; } public double getScore(){ return this.score; } @Override public String toString() { return “姓名:” this.name ,分数: this.score; }
} class StudentComparator implements Comparator { @Override public int compare(Student o1,Student o2) { if(o1.getScore() > o2.getScore()){ return 1; }else if(o1.getScore() < o2.getScore()){ return -1; }else{ return 0; } } }
public class TestComparator {
public static void main(String[] args) { Student[] sts = new Student[]{ new Student("小戴",60), new Student("小王",90), new Student("老王",80), new Student("小萱",95) }; java.util.Arrays.sort(sts, new StudentComparator()); System.out.println(java.util.Arrays.toString(sts)); }
}
或者调用Collections.sort(list,new Comparator());