1. 程式人生 > >Java學習筆記(32)-Comparable介面

Java學習筆記(32)-Comparable介面

package day03;
/**
 * 可比較的點
 * 若我們定義的類想在陣列或集合中可以排序,我們需要將當前類實現
 * Comparable介面,並定義比較規則
 * @author Administrator
 *
 */
public class ComparablePoint
	implements Comparable<ComparablePoint>{
	/**
	 * 屬性定義
	 */
	private int x;
	private int y;
	public ComparablePoint(int x,int y){
		this.x = x;
		this.y = y;
	}
	/**
	 * 比較方法,該方法由Comparable介面定義
	 * 所有子類均需要實現該方法來定義比較規則
	 * 比較規則:
	 * 比較點到原點的距離,誰的距離長誰大
	 */
	public int compareTo(ComparablePoint o) {
		//自身點到原點的距離
		int r = x*x+y*y;
		//引數點到原點的距離
		int other = o.x*o.x+o.y*o.y;
		/**
		 * 返回結果大於0,自身比引數大
		 * 小於0,自身比引數小
		 * 等於0,自身和引數相等
		 * 需要注意:
		 * equals返回true的時候,
		 * comparaTo的返回值應該為0
		 * 反過來也一樣
		 */
		return r - other;
	}
	public String toString(){
		return "x="+x+",y"+y;
	}

}

Collection與Collections的區別?

Collection是集合的介面

Collection類

集合的工具類。提供了對集合操作的若干方法

sort():該方法可以對集合中的元素做自然排序

package day03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * 測試集合工具類對集合元素進行的自然排序
 * 要確保集合中的元素是Comparable的子類!
 * @author Administrator
 *
 */
public class DemoComparable {
	public static void main(String[] args) {
		List<ComparablePoint> list  = new ArrayList<ComparablePoint>();
		//向集合中存放3個物件
		list.add(new ComparablePoint(1,5));
		list.add(new ComparablePoint(3,4));
		list.add(new ComparablePoint(2,2));
		
		System.out.println(list);//輸出順序與存放時一致
		/**
		 * 使用集合工具類對集合進行自然排序
		 * 該方法會一次呼叫集合中每個元素的compareTo方法進行比較
		 */
		Collections.sort(list);
		System.out.println(list);
	}
}

Comparator比較器

它是一個介面。實現該介面的類需要實現一個抽象方法int compareTo(E o1,E o2)

該方法返回值大於0:o1比o2大

該方法返回值小於o: o1比o2小

該方法返回值等於o: o1與o2相等

比較器可以用於比較集合中的元素。

Collections提供了sort的過載方法,支援傳入一個比較器對集合進行比較 。

如何用eclipse自動公開屬性值?

空白處右鍵source->generator getters and setters

package day03;
/**
 * 可比較的點
 * 若我們定義的類想在陣列或集合中可以排序,我們需要將當前類實現
 * Comparable介面,並定義比較規則
 * @author Administrator
 *
 */
public class ComparablePoint
	implements Comparable<ComparablePoint>{
	/**
	 * 屬性定義
	 */
	private int x;
	private int y;
	public ComparablePoint(int x,int y){
		this.x = x;
		this.y = y;
	}
	
	public int getX() {
		return x;
	}

	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}

	public void setY(int y) {
		this.y = y;
	}

	/**
	 * 比較方法,該方法由Comparable介面定義
	 * 所有子類均需要實現該方法來定義比較規則
	 * 比較規則:
	 * 比較點到原點的距離,誰的距離長誰大
	 */
	public int compareTo(ComparablePoint o) {
		//自身點到原點的距離
		int r = x*x+y*y;
		//引數點到原點的距離
		int other = o.x*o.x+o.y*o.y;
		/**
		 * 返回結果大於0,自身比引數大
		 * 小於0,自身比引數小
		 * 等於0,自身和引數相等
		 * 需要注意:
		 * equals返回true的時候,
		 * comparaTo的返回值應該為0
		 * 反過來也一樣
		 */
		return r - other;
	}
	public String toString(){
		return "x="+x+",y"+y;
	}

}
package day03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 測試集合工具類對集合元素進行的自然排序
 * 要確保集合中的元素是Comparable的子類!
 * @author Administrator
 *
 */
public class DemoComparable {
	public static void main(String[] args) {
		List<ComparablePoint> list  = new ArrayList<ComparablePoint>();
		//向集合中存放3個物件
		list.add(new ComparablePoint(1,5));
		list.add(new ComparablePoint(3,4));
		list.add(new ComparablePoint(2,2));
		
		System.out.println(list);//輸出順序與存放時一致
		/**
		 * 使用集合工具類對集合進行自然排序
		 * 該方法會一次呼叫集合中每個元素的compareTo方法進行比較
		 */
		Collections.sort(list);
		System.out.println(list);
		/**
		 * 在排序集合元素時,我們不想根據元素的比較規則來進行
		 * 排序:按照x值自小至大的順序排序集合元素
		 * 自定義的比較規則實現需要以下步驟:
		 * 1:定義一個類並實現Comparator介面
		 * 2:實現介面中的抽象方法compareTo(E o1,E o2)
		 * 3:例項化這個比較器
		 * 4:呼叫Collections的過載方法
		 * sort(Collection c,Comparator comparator)
		 * 進行排序
		 * 
		 * 使用匿名類方式建立一個例項來定義比較器
		 */
		Comparator<ComparablePoint> c = new Comparator<ComparablePoint>(){
			/**
			 * 自定義的比較規則
			 * o1
			 * o2
			 * 
			 * return 大於0:o1>o2,小於0:o1<o2 等於0:o1==o2
			 */
			public int compare(ComparablePoint o1,ComparablePoint o2){
				//兩個點的x值大的大
				return -(o1.getX() - o2.getX());
			}
		};
		Collections.sort(list,c);
		System.out.println(list);
	}
}
package day03;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * 自定義比較器練習
 * @author Administrator
 *
 */
public class DemoComaparator {
	public static void main(String[] args) {
		/**
		 * 定義一個字串集合
		 * 集合中存放:"Tom","Jerry","Boss","Killer","Kack","Clark"
		 * 使用自然排序檢視排序結果
		 * 自定義排序規則:字母長的在後面,進行排序
		 */
		List<String> list = new ArrayList<String>();
		list.add("Tom");
		list.add("Jerry");
		list.add("Boss");
		list.add("Killer");
		list.add("Kack");
		list.add("Clark");
		System.out.println(list);
		/**
		 * 使用String自定義的排序規則做自然排序
		 */
		Collections.sort(list);
		
		System.out.println(list);
		
		Comparator<String> comparator = 
				new Comparator<String>(){
			/**
			 * 字串字元多的在後面
			 * o1
			 * o2
			 * return 
			 */
			public int compare(String o1,String o2){
				return o1.length() - o2.length();
			}
		};
		Collections.sort(list,comparator);
		
		System.out.println(list);
	}
}