二維陣列Arrays.sort()方法重寫
阿新 • • 發佈:2021-07-08
Java Arrays.sort方法重寫及二維陣列排序
重寫模板
Arrays.sort(T[], new Comparator<T>() {
public int compare(T a, T b){
return fa - fb;
}
});
對於二維陣列的排序,需要使用匿名類來實現,重寫compare函式,這個其實是自己學過的,只是老是忘啊,記下來多複習。
public static void main(String[] args) { int[][] nums = new int[][]{{1,3},{1,2},{4,5},{3,7}}; Arrays.sort(nums, new Comparator<int[]>() { public int compare(int[] a, int[] b){ if(a[0]==b[0]){ return a[1] - b[1]; }else { return a[0] - b[0]; } } }); for(int i=0;i<nums.length; i++){ System.out.println(Arrays.toString(nums[i])); } }
參考: https://blog.csdn.net/qq_41682302/article/details/95949646
下面是how2java的比較器知識點,分別使用實現介面和引入Comparator的方式。
比較器
對於一個有多個屬性的類物件,要比較其大小,可以用comparator進行
重寫一下comparator,然後傳給sort函式即可
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); } }
另一種方法是使hero實現comparable介面,在類裡面提供比較演算法,在sort的時候就不需要傳入comparator引數了
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"; } }