今天發現Java中有兩種比較器,原來之前一直是用的util包的比較器,還有一個lang包的比較器沒用過,就試了一下。
其實這兩個比較器的内部原理都是歸并排序算法,故具有穩定性,并且時間複雜度可以達到O(N*logN)
使用方法其實也差不了多少,不過我覺得util包的更為簡便好用
1java.util.Comparator<T>
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);
}
}
2.java.lang.Comparable<T>
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;
}
}