java中的Comparator和Comparable比較器的使用

Comparable和Comparator都是用來實現集合中的排序的,Comparator位於包java.util下,而Comparable位於包java.lang下,Comparable是一個對象本身就已經支持自比較所需要實現的接口(如 String、Integer 自己就可以完成比較大小操作),是內部定義的排序;而後者在一個獨立的類中實現比較,是外部實現的排序。 如果一個類沒有實現Comparable接口,或是這個對象不支持自比較或者自比較函數不能滿足你的要求時,可以通過Comparator來實現比較算法進行排序,並且爲了使用不同的排序標準做準備,比如:升序、降序。所以,如想實現排序,就需要讓類對象自身實現Comparable接口,重寫其中的compareTo(T o)方法;或在外部定義比較器實現Comparator接口,重寫其compare(T o1,T o2)方法。前者只有一個參數,後者有兩個參數。排序時可以調用java.util.Arrays.sort()來排序對象數組,或是調用集合中的sort()方法就可以按照相應的排序方法進行排序。方法返回一個基本類型的整型,返回負數表示o1小於o2,返回0表示o1和o2相等,返回正數表示o1大於o2。 

用 Comparator 是策略模式(strategy design pattern),就是不改變對象自身,而用一個策略對象(strategy object)來改變它的行爲。比如:你想對整數採用絕對值大小來排序,Integer 是不符合要求的,你不需要去修改 Integer 類(實際上你也不能這麼做)去改變它的排序行爲,只要使用一個實現了Comparator接口的對象來實現控制它的排序就行了。


import java.util.Arrays;
import java.util.Comparator;
class Person implements Comparable<Person>{
	private String name;
	private int age;
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.age;
	}
	@Override
	public String toString() {
		return ""+this.name+" "+this.age;
	}

	public int compareTo(Person o) {
		
		if (this.getName().compareTo(o.getName()) != 0)
			return this.getName().compareTo(o.getName());
		else {
			if (this.getAge() < o.getAge())
				return -1;
			else if (this.getAge() > o.getAge())
				return 1;
			else return 0;
		}
	}
}

class Cmp implements Comparator {

	public int compare(Object arg0, Object arg1) {
		Person a = (Person) arg0;
		Person b = (Person) arg1;
		if (a.getName().compareTo(b.getName()) != 0)
			return a.getName().compareTo(b.getName());
		else {
			if (a.getAge() < b.getAge())
				return -1;
			else if (a.getAge() > b.getAge())
				return 1;
			else return 0;
		}
	}
}
public class Main {
	public static void main(String[] args) {
		Person[] p = new Person[4];
		p[0] = new Person("ZZZ",19);
		p[1] = new Person("AAA", 109);
		p[2] = new Person("AAA", 19);
		p[3] = new Person("YYY",100);
		Arrays.sort(p);//調用自有的排序
//		Arrays.sort(p, new Cmp());//調用Comparator定義的排序
		System.out.println(Arrays.toString(p));
	}
}


原文作者:happylifex 
原文:https://blog.csdn.net/happylifex/rticle/details/44678341

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章