二维数组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";
    }
      
}


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM