javable之Comparable

本文介绍了在Java中,如何使自定义类型支持集合类中的排序算法,如Collections.sort()、Collections.min()和Collections.max()。通过实现Comparable接口或传入Comparator比较器,可以按照自定义规则对List中的对象进行排序和查找最大最小值。示例代码展示了Dog类的年龄升序排序和查找最大最小年龄的Dog对象。

我们知道,在Java的集合类中是有一些可复用的算法的,比如
Collections.sort()从小到大排序,Collections.min(),最小值Collections.max()最大值,
这些对于list操作来说都是非常常见的,也经常需要用到

1 List strings = new ArrayList();
2 strings.add(“ab”);
3 strings.add(“cc”);
4 strings.add(“bc”);
5 Collections.sort(strings);
6 String max =Collections.max(strings);
7 String min =Collections.min(strings);
8 System.out.println(strings);//[ab, bc, cc]
9 System.out.println(max);//cc
10 System.out.println(min);//ab
11
12 List integers = new ArrayList();
13 integers.add(2);
14 integers.add(1);
15 integers.add(3);
16 Collections.sort(integers);
17 Integer max1 =Collections.max(integers);
18 Integer min1 =Collections.min(integers);
19 System.out.println(integers);//[1, 2, 3]
20 System.out.println(max1);//3
21 System.out.println(min1);//1

那么问题就来了,例子中的String,Integer,都是可比较的元素,如果是自定义的ADT怎么办呢?或者是如何按照我们想的比大小的方式,比如这里String是字典序,Integer是升序,我想要换一种方式,怎么办呢?
这里有两种方法

1实现Comparable 排序接口,并实现public int compareTo(Object o)方法

1 public class UseAnimals {
2 public static void main(String[] args) {
3
4 List dogs = new ArrayList();
5 Dog dog1 = new Dog(1,“Mary”);
6 Dog dog2 = new Dog(3,“Elizabeth”);
7 Dog dog3 = new Dog(2,“Anne Boleyn”);
8 dogs.add(dog1);
9 dogs.add(dog2);
10 dogs.add(dog3);
11 Collections.sort(dogs);
12 Dog max =Collections.max(dogs);
13 Dog min =Collections.min(dogs);
14 System.out.println(dogs);//[Mary 1, Anne Boleyn 2, Elizabeth 3]
15 System.out.println(max);//Elizabeth 3
16 System.out.println(min);//Mary 1
17 }
18
19 }
20
21 class Dog implements Comparable {
22 int age;
23 String name ;
24 public Dog (int age,String name)
25 {
26 this.age=age;
27 this.name=name;
28 }
29
30 @Override
31 public int compareTo(Dog o) {
32 // TODO Auto-generated method stub
33 return (this.age>o.age)? 1:-1;
34 }
35 @Override
36 public String toString() {
37 // TODO Auto-generated method stub
38 return name+" "+age;
39 }
40
41 }
  
2.通过传入参数比较器Comparator来实现
1 public static void main(String[] args) {
2
3 List dogs = new ArrayList();
4 Dog dog1 = new Dog(1,“Mary”);
5 Dog dog2 = new Dog(3,“Elizabeth”);
6 Dog dog3 = new Dog(2,“Anne Boleyn”);
7 dogs.add(dog1);
8 dogs.add(dog2);
9 dogs.add(dog3);
10
11 Comparator cia = new Comparator(){
12 @Override
13 public int compare(Dog o1, Dog o2) {
14 return o1.age - o2.age;
15}
16 };
17 Collections.sort(dogs,cia);
18 Dog max =Collections.max(dogs);
19 Dog min =Collections.min(dogs);
20 System.out.println(dogs);//[Mary 1, Anne Boleyn 2, Elizabeth 3]
21 System.out.println(max);//Elizabeth 3
22 System.out.println(min);//Mary 1
23
24 }
  
当然也可以简单写成:

1 Collections.sort(dogs, new Comparator() {
2
3 @Override
4 public int compare(Dog o1, Dog o2) {
5 return o1.age - o2.age;
6 }
7 });
  这样就可以实现对自定义的ADT以自己想要的方式排序或者一键最大最小值了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值