Java Comparator和Comparable 步驟 1 : Comparator 假設Hero有三個屬性 name,hp,damage 一個集合中放存放10個Hero,通過Collections.sort對這10個進行排序 那麼到底是 hp小的放前面?還是damage小的放前面 ?Colle ...
Java Comparator和Comparable
步驟 1 : Comparator
假設Hero有三個屬性 name,hp,damage
一個集合中放存放10個Hero,通過Collections.sort對這10個進行排序
那麼到底是hp小的放前面?還是damage小的放前面?Collections.sort也無法確定
所以要指定到底按照哪種屬性進行排序
這裡就需要提供一個Comparator給定如何進行兩個對象之間的大小比較
//Hero.java
package charactor;
public class Hero {
public String name;
public float hp;
public int damage;
public Hero() {
}
public Hero(String name) {
this.name = name;
}
public String toString() {
return "Hero [name=" + name + ", hp=" + hp + ", damage=" + damage + "]\r\n";
}
public Hero(String name, int hp, int damage) {
this.name = name;
this.hp = hp;
this.damage = damage;
}
}
//TestCollection.java
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import charactor.Hero;
public class TestCollection {
public static void main(String[] args) {
Random r =new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 10; i++) {
//通過隨機值實例化hero的hp和damage
heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
}
System.out.println("初始化後的集合:");
System.out.println(heros);
//直接調用sort會出現編譯錯誤,因為Hero有各種屬性
//到底按照哪種屬性進行比較,Collections也不知道,不確定,所以沒法排
//Collections.sort(heros);
//引入Comparator,指定比較的演算法
Comparator<Hero> c = new Comparator<Hero>() {
@Override
public int compare(Hero h1, Hero h2) {
//按照hp進行排序
if(h1.hp>=h2.hp)
return 1; //正數表示h1比h2要大
else
return -1;
}
};
Collections.sort(heros,c);
System.out.println("按照血量排序後的集合:");
System.out.println(heros);
}
}
步驟 2 : Comparable
使Hero類實現Comparable介面
在類裡面提供比較演算法
Collections.sort就有足夠的信息進行排序了,也無需額外提供比較器Comparator
註: 如果返回-1, 就表示當前的更小,否則就是更大
package charactor;
public class Hero implements Comparable<Hero>{
public String name;
public float hp;
public int damage;
public Hero(){
}
public Hero(String name) {
this.name =name;
}
//初始化name,hp,damage的構造方法
public Hero(String name,float hp, int damage) {
this.name =name;
this.hp = hp;
this.damage = damage;
}
@Override
public int compareTo(Hero anotherHero) {
if(damage<anotherHero.damage)
return 1;
else
return -1;
}
@Override
public String toString() {
return "Hero [name=" + name + ", hp=" + hp + ", damage=" + damage + "]\r\n";
}
}
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Random;
import charactor.Hero;
public class TestCollection {
public static void main(String[] args) {
Random r =new Random();
List<Hero> heros = new ArrayList<Hero>();
for (int i = 0; i < 10; i++) {
//通過隨機值實例化hero的hp和damage
heros.add(new Hero("hero "+ i, r.nextInt(100), r.nextInt(100)));
}
System.out.println("初始化後的集合");
System.out.println(heros);
//Hero類實現了介面Comparable,即自帶比較信息。
//Collections直接進行排序,無需額外的Comparator
Collections.sort(heros);
System.out.println("按照傷害高低排序後的集合");
System.out.println(heros);
}
}
練習: 自定義順序的TreeSet
預設情況下,TreeSet中的數據是從小到大排序的,不過TreeSet的構造方法支持傳入一個Comparator
public TreeSet(Comparator comparator)
通過這個構造方法創建一個TreeSet,使得其中的的數字是倒排序的
答案 :
package collection;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeSet;
public class TestCollection {
public static void main(String[] args) {
Comparator<Integer> c =new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
};
Set<Integer> treeSet = new TreeSet<>(c);
for (int i = 0; i < 10; i++) {
treeSet.add(i);
}
System.out.println(treeSet);
}
}