java基础 Arrays.sort()用法
1. 作用
对数组按照一定顺序排列,默认为升序。
排列过程中为快排,不需要额外的空间,也不需要重新定义一个数组来接收它。
示例:
public class Test {
    public static void main(String[] args) {
        int[] nums={1,2,43,5,1,2,6,3,8};
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
    }
}
输出:
[1, 1, 2, 2, 3, 5, 6, 8, 43]
2.介绍
2.1 重载方法
- sort(T[] a):对指定T型数组按数字升序排序。
 - sort(T[] a,int formIndex, int toIndex):对指定T型数组中[formIndex,toIndex)数据按数字升序排序。
 - sort(T[] a, Comparator<? supre T> c): 依据比较器对T型数组进行排序。
 - sort(T[] a, int formIndex, int toIndex, Comparator<? supre T> c): 依据比较器产生的顺序对T型数组中的[formIndex,toIndex)进行排序。
 
2.2 使用方法
2.2.1 基础使用方法
package test;
import java.util.Arrays;
import java.util.Comparator;
public class Test<main> {
    public static void main(String[] args) {
        //1.sort(T[] a)
        int[] nums1={1,4,2,4,5,1};
        Arrays.sort(nums1);
        System.out.println(Arrays.toString(nums1));
        //output:[1, 1, 2, 4, 4, 5]
        //2. sort(T[] a,int start,int end)
        int[] nums2={1,4,2,4,5,1};
        Arrays.sort(nums2,2,5);
        System.out.println(Arrays.toString(nums2));
        //output:[1, 4, 2, 4, 5, 1]
        //3. sort(T[] a,Comparator<? super T> c)
        Integer[] nums3={1,4,2,4,5,1};
        Arrays.sort(nums3,new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(nums3));
        //output:[5, 4, 4, 2, 1, 1]
        //4. sort(T[] a,Comparator<? super T> c,int  start,int end)
        Integer[] nums4={1,4,2,4,5,1};
        Arrays.sort(nums4,2,5,new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2-o1;
            }
        });
        System.out.println(Arrays.toString(nums4));
        //output:[1, 4, 5, 4, 2, 1]
    }
}
2.2.2 进阶用法
对于sort()函数,个人觉得比较难的点是比较器的构建,下面将介绍sort()中比较器的不同用方法
1.比较器的构建
首先思考一个问题,为什么对于基本数据类型(boolean除外),为什么可以直接使用sort(T[] a),而不需要构建比较器?
原因:对于基本数据类型和其包装类来说,内部已经实现了Comparable
public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }
那就又引申出来另外一个问题,实现Comparable
具体的可以参考这一篇 Comparator和Comparable的区别
2.多维数据排序
在以前ACM训练中,经常遇到进行多维数据比较并排序,下面对介绍多维比较器的构建。
案例:对于用户存在三维数据:年龄,名字,身份ID。
建立比较器:首先按照年龄大小逆向排序,若相等,则按照id正向排序
User.java:
package test;
public class User {
    int age;
    String name;
    int id;
    public User(int age, String name) {
        this.age = age;
        this.name = name;
    }
    public User(int age, String name, int id) {
        this.age = age;
        this.name = name;
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
	@Override
    public String toString() {
        return "User{" +
                "age=" + age +
                ", name='" + name + '\'' +
                ", id=" + id +
                '}';
    }
}
Test.java:
package test;
import java.util.Arrays;
import java.util.Comparator;
public class Test<main> {
    public static void main(String[] args) {
        User[] users=new User[5];
        users[0]=new User(1,"alice",1);
        users[1]=new User(1,"alice",2);
        users[2]=new User(2,"alice",3);
        users[3]=new User(2,"Bob",4);
        users[4]=new User(3,"Bob",5);
        Arrays.sort(users, new Comparator<User>() {
            @Override
            public int compare(User o1, User o2) {
                if(o2.age!=o1.age){
                    return o2.age-o1.age;
                }else{
                    return o1.id-o2.id;
                }
            }
        });
        System.out.println(Arrays.toString(users));
    }
}
输出:
[User{age=3, name='Bob', id=5}
, User{age=2, name='alice', id=3}
, User{age=2, name='Bob', id=4}
, User{age=1, name='alice', id=1}
, User{age=1, name='alice', id=2}
]
                    
                
                
            
        
浙公网安备 33010602011771号