关于java数组比较器排序

前些天一个基础性的问题纠结了好半天,那就是比较器中数组自定义元素的冒泡排序。

其实说起来也简单,当数组中存的元素是自定义对象,或者是Object类,我们都可以用冒泡进行排序。无非就是类型之间的转换,然后再进行比较。

那么当你自定义一个对象后,然后添加到数组中,这时再要求你写个方法,可以传入比较器进行比较,陌生感油然而生。

就我而言,通常比较器都是用在TreeSet,TreeMap中,这样子搞还真有点懵逼!

 

然后查看Arrays工具类中,发现还真有个sort(Object[] obj,Comparator comparator)可以传入比较器的方法,但像我这种菜鸟源码也是看了半天。当然是真的很简单。

然后又查看了Collections工具类,发现也有个sort(List<> list,Comparator comparator)可以传入比较器,比较自定义排序List集合的方法。

 

JDK为我们提供了两种比较接口,Comparable(自然排序)和Comparator(比较器排序)。

自然排序就不累赘了,自定义类实现接口重写方法,然后就可以了。但这种方式比较笨重,不够灵活,当然也是可以得。

那么毫不犹豫的去看了Comparator怎么用?也不难,就两个方法,compare(Object o1, Object o2)和equals()方法。

compare(Object o1, Object o2)方法的意思是按照比较器给出的比较排序算法,对上述Object数组进行排序。

 

废话不多说:要求是这样的:利用冒泡排序对任意类型的数组排序。提示:可以给排序方法传递一个比较器

 

public class Demo_03 {
public static void main(String[] args) {

//创建自定义学生数组,有7个学生
Student[] arr = {new Student("Anny",5),new Student("Nacy",5),new Student("Nacy",7),
new Student("Jack",4),new Student("Tom",4),new Student("John",6),new Student("Jerry",6)};

//写排序方法,传入学生数组和比较器
//由于比较器是接口,那么只能用匿名内部类,另外重写compare()方法,这样子,顺便进行自定义元素排序
sort(arr,new Comparator<Student>() {


@Override
public int compare(Student s1, Student s2) {
int num = s1.getAge() - s2.getAge();
num = num == 0 ? s2.getName().compareTo(s1.getName()) : num;
return num == 0 ? 1 : num;
}
});
//打印
for(Student s : arr) {
System.out.println(s);
}
}
//排序方法
//方法参数里边传入比较器子类对象
public static void sort(Student[] arr, Comparator<Student> comparator) {
for(int i = 0; i < arr.length - 1; i++) {
for(int j = 0; j < arr.length - 1; j++) {
//那么比较器子类对象就可以用compare()方法了,传入要进行冒泡比较的相邻两个元素
//当然这里的比较顺序,也和上边自定义比较器中的顺序相关
if(comparator.compare(arr[j], arr[j+1]) > 0) {
Student s = arr[j];
arr[j] = arr[j+1];
arr[j+1] = s;
}
}
}
}
}

那么简单的说:自定义排序方法,还要传入比较器比较,那么只要重写比较器接口中的方法即可。

记得:要传入比较器的内匿名内部类作为子类对象,重写compare()方法,然后传入比较器子类对象,调用compare()方法,完成比较

 

第一篇博客:写的好烂  *—*  

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值