java的两个比较器

comparable和compartor都是接口,两个接口使用的是策略模式

  1. comparable: 想要具有比较功能的类需要实现comparable接口,并且重写compareTo方法,方法参数必须是Object,需要强制类型转换,(可以先用instanceof判断一下)
  2. compartor: 这个可以在不改变原来的类的情况下实现比较,只需要写一个xxxCompartor(其实命名随意,这样更易懂)来实现Compartor接口即可,同时重写compare方法,形参是xxx类(就是原有的需要比较的类).

注意点:
这里面compare方法和compareto方法返回值全是int,以正负为结果,而不是0和1;
父类实现了compartable的话,子类可以进行比较,当然也可以重写compartTo方法

如果采用第二种,子类可以在比较的时候传入父类的compare方法,这样的话就等于向上转型为父类进行比较,也是可以的,或者再写一个子类Compartor实现Compartor接口重写定义比较方法.

这里是父类Person

public class Person implements Comparable {
    public int age;

    public Person() {
        age = (int) (Math.random() * 10);
        System.out.println("age = " + age);
    }

    @Override
    public String toString() {
        return "Person{" +
                "age=" + age +
                '}';
    }

    @Override
    public int compareTo(Object o) {
        Person p = null;
        if(o instanceof Person){
            p = (Person) o;
        }else return -1;
        if (this.age < p.age) return -1;
        else
            return 0;
    }

    public void say() {
        System.out.println("haha!");
    }
}

这是子类son,重写了父类的compareTo方法

package package1;

public class son extends Person {
    @Override
    public String toString() {
        return "son{" +
                "age=" + age +
                '}';
    }
    @Override
    public int compareTo(Object o){
        return -1;
    }
}

父类比较算法

package package1;

import java.util.Comparator;

public class PersonComparator implements Comparator<Person> {
    @Override
    public int compare(Person o1, Person o2) {
        if (o1.age < o2.age)
            return -1;
        else return 1;
    }
}

测试类:

import package1.PersonComparator;
import package1.Person;
import package1.son;

import java.util.*;

public class test {
    private int i;

    public static void main(String[] args) {
        List a = new ArrayList<Person>();
        int n = 10;
        while (n-- > 0) {
            Person p = new son();
            a.add(p);
        }
//        a.sort(new PersonComparator());
//        Collections.sort(a,new PersonComparator());
        Collections.sort(a);
        for (Iterator it = a.listIterator(); it.hasNext();){
            System.out.println(it.next());
        }
//        int n = 5;
            while (n-- > 0) {
                System.out.println(1);
            }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值