快捷搜索: 脱发

java数组排序,升序和降序

前言

对于数组的排序一直很疑惑,尤其是如何对数组进行降序排列,例如要对int[]类型的数组降序排列,这里来进行说明

基本数据类型排序

升序

int[] nums = {
          
   4, 3, 5, 2, 6, 1,7};

如果我们要对上面代码进行升序排列,我们只需要调用Arrays.sort的方法即可

将数组传入即可,支持基本数据类型,这个sort就会对数组进行排序

Arrays.sort(nums);

排序后输出结果如下

[1, 2, 3, 4, 5, 6, 7]

降序排列

对于基本数据类型,并没有现成的api,但是我们可以将排序后的数组进行翻转

int[] nums = {
          
   4, 3, 5, 2, 6, 1,7};
        Arrays.sort(nums);
        // 翻转数组
        for (int i = 0; i < nums.length / 2; i++) {
          
   
            int t = nums[i];
            nums[i] = nums[nums.length - i - 1];
            nums[nums.length - i - 1] = t;
        }
        System.out.println(Arrays.toString(nums));

输出结果如下

[7, 6, 5, 4, 3, 2, 1]

基本数据类型包装类

升序

用基本数据类型的包装类来进行升序排列调用Aarrays.sort即可

Integer[] nums = {
          
   4, 3, 5, 2, 6, 1,7};
        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));

降序

如果要降序排列,在sort后面传入一个Comparator接口即可,下面我使用的是lambda表达式,如果是o1-o2表示升序,o2-o1表示降序,具体的在下面的对象排序里面讲

Integer[] nums = {
          
   4, 3, 5, 2, 6, 1, 7};
        Arrays.sort(nums, (o1, o2) -> o2 - o1);
        System.out.println(Arrays.toString(nums));

输出内容如下

[7, 6, 5, 4, 3, 2, 1]

对象排序

升序

下面是我自定义的一个Cat类

class Cat {
          
   
    String name;
    int age;

    public Cat(String name, int age) {
          
   
        this.name = name;
        this.age = age;
    }
    
    @Override
    public String toString() {
          
   
        return "Cat{" +
                "name=" + name +  +
                ", age=" + age +
                };
    }
}

初始的Cat类数组如下

Cat[] cats = {
          
   
                new Cat("大黄", 2),
                new Cat("小黑",1),
                new Cat("旺财", 3),
                new Cat("大黑", 4)
        };

该数组没排序前输出如下

Cat{name=大黄, age=2}
Cat{name=小黑, age=1}
Cat{name=旺财, age=3}
Cat{name=大黑, age=4}

下面我想对年龄进行排序,我们使用的也是Arrays.sort

我们需要传入一个Comparator,new一个,实现里面的compare方法即可,sort会根据compare返回的值来进行排序,如果返回负数就会将前面个值放到前面

Arrays.sort(cats, new Comparator<Cat>() {
          
   
            @Override
            public int compare(Cat cat1, Cat cat2) {
          
   
                return cat1.age - cat2.age;
            }
        });

或者使用lambda表达式

Arrays.sort(cats, (cat1, cat2) -> cat1.age - cat2.age);

也可以写成下面这种写法

Arrays.sort(cats, Comparator.comparingInt(cat -> cat.age));

最后的一种写法就表示使用Cat的age属性来进行比较,三种写法输出结果都是升序排列的,如下

Cat{name=小黑, age=1}
Cat{name=大黄, age=2}
Cat{name=旺财, age=3}
Cat{name=大黑, age=4}

降序

会升序排列了,降序就是将compare的结果变成相反就行了

Arrays.sort(cats, new Comparator<Cat>() {
          
   
            @Override
            public int compare(Cat cat1, Cat cat2) {
          
   
                return cat2.age - cat1.age;
            }
        });

lambda写法如下

Arrays.sort(cats, (cat1, cat2) -> cat2.age - cat1.age);

我们也可以这样写

Arrays.sort(cats, Comparator.comparingInt(cat -> -cat.age));

输出结果都是降序排列的

Cat{name=大黑, age=4}
Cat{name=旺财, age=3}
Cat{name=大黄, age=2}
Cat{name=小黑, age=1}
经验分享 程序员 微信小程序 职场和发展