1. 程式人生 > 其它 >二維陣列Arrays.sort()方法重寫

二維陣列Arrays.sort()方法重寫

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";
    }
      
}