Java學習筆記(32)-Comparable介面
阿新 • • 發佈:2019-01-28
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);
}
}