天天看點

兩種比較器的使用

今天發現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;
	}
}