Java中的比较器
时间:2023-04-09 23:07:00
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());