今天发现Java中有两种比较器,原来之前一直是用的util包的比较器,还有一个lang包的比较器没用过,就试了一下。
其实这两个比较器的内部原理都是归并排序算法,故具有稳定性,并且时间复杂度可以达到O(N*logN)
使用方法其实也差不了多少,不过我觉得util包的更为简便好用
import java.util.Arrays;
import java.util.Comparator;
import java.util.Random;
public class UtilComparator {
public static class Student{
private String name;
private int id;
private int age;
public Student(String name,int id,int age){
this.name = name;
this.id = id;
this.age = age;
}
public String toString(){
return "id="+id+","+name+","+age;
}
public int getAge() {
return age;
}
}
//util包的比较器
//比较器具有稳定性
public static class ageComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
return o1.age-o2.age;//正数就交换(这里也就是o1大就交换,就是从小到大了)
}
}
public static void printObj(Object obj[]){
for (Object object : obj) {
System.out.println(object);
}
}
public static void main(String[] args) {
Student []students = new Student[10];
for (int i = 0; i < students.length; i++) {
students[i] = new Student("Jack"+i, i, new Random().nextInt(50)+10);
}
Arrays.sort(students,new ageComparator());
printObj(students);
}
}
import java.util.Arrays;
import java.util.Random;
public class LangCompatator {
public static void main(String[] args) {
Student2 []students = new Student2[10];
for (int i = 0; i < students.length; i++) {
students[i] = new Student2("Jack"+i, i, new Random().nextInt(50)+10);
}
Arrays.sort(students);
printObj(students);
}
public static void printObj(Object obj[]){
for (Object object : obj) {
System.out.println(object);
}
}
}
//使用lang包的比较器
//比较器具有稳定性
class Student2 implements Comparable<Student2>{
private String name;
private int id;
private int age;
public Student2(String name,int id,int age){
this.name = name;
this.id = id;
this.age = age;
}
public String toString(){
return "id="+id+","+name+","+age;
}
public int getAge() {
return age;
}
@Override
public int compareTo(Student2 o) {
return this.getAge()-o.age;
}
}