前言
对于数组的排序一直很疑惑,尤其是如何对数组进行降序排列,例如要对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}