重点在于判断 对象 谁大谁小
尤其是比较类对象的 “谁大谁小”
打印类对象 print(a) 必须在类里要重写 toString() 方法
@Override
public String toString(){
return this.food+"";//后面那个双引号是为了把整个转成字符串。不能直接int打印出
}
对多种类型(当然都是同种类型)来比较
比较对象的方式(标准)由各个子类自己去定义
申明一个“比较接口” 里面有一个“方法申明” 比较大小,参数就是Object类型(这里只传一个参数,意思是自己和传进来的那个对象比较大小),
//补充一下,这里传入的参数可以是Comparable 对象,因为所有比较对象都有实现comparable接口,所以无所谓还是用Object 类型,再强制转换
返回值是int 型 大于0 小于0 等于0
所有的实体类都必须实现这个“比较接口”,这里就要重写接口里“方法申明” 的方法
if(o instanceof Cat){ // 如果object 是一个”猫“类 的对象
Cat c=(Cat)o; // 强制转为猫
if(this.getHeight()>c.getHeight())return 1; // 再比较大小
else if(this.getHeight()<c.getHeight())return -1;
else return 0;
}
return -100;
写法:
“比较接口” o1 =(“比较接口”) 参与比较的第一个传入对象
“比较接口” o2 =(“比较接口”) 参与比较的第二个传入对象
if(o1.接口里“方法申明” 的方法(o2)==0) //这里就是参与比较了
扩展,因为虽然每个类里自定义了compareTo方法,实现了comparable 接口,但是排序规则还是相对来说固定的
所以,为了能适应将来的多变的compare 比较方式
申明一个接口 “大小比较器” 比较大小,里面有一个“方法申明” 比较大小 (这里传入两个Object 类型的对象,相互比较大小)
//补充一下,这里传入的参数可以是Comparable 对象,因为所有比较对象都有实现comparable接口,所以无所谓还是用Object 类型,再强制转换
申明一个比较器类,表示 按照某种标准 比较大小的 比较器 实现 上面的 “大小比较器” 接口(重点就在这里,就是各个比较器类的比较标准不同),
重写里面的比较方法,把类对象比较的标准和方法写完
把 compareTo 方法 内容 写成
return new 比较器类().compare(this, o);
或者把 比较器类 在类里实例化
然后 直接用 对象.compare()
写成:
private “大小比较器” comparator=new 比较器类(); // 每次替换就只要替换这里的比较器类就可以了
// 也可以给comparator 加上getter 和 setter 方法 更方便
在 compareTo方法里 写成 return comparator.compare(this, o);
普通类对象还是要实现comparable接口 重写 compareTo 方法
只不过 重写CompareTo 方法的时候 交给具体的 Comparator (策略和标准)去实现
使用jdk 自带的comparable 接口 就要指定 对应类型的泛型方式<Cat>
Comparator 也要指定 对应类型的泛型方式<Cat>
中间实现方式过程里就不用强制类型转换了
实际运用可以直接用 java.util.Array.sort(a); // 对数组类型进行排序,这里的a数组里所有的元素必须实现comparable 接口