java compare设计_java 设计模式 策略模式,comparable 接口,compareTo 方法

重点在于判断 对象   谁大谁小

尤其是比较类对象的 “谁大谁小”

打印类对象 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()

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 接口 就要指定 对应类型的泛型方式

Comparator 也要指定 对应类型的泛型方式

中间实现方式过程里就不用强制类型转换了

实际运用可以直接用  java.util.Array.sort(a); //  对数组类型进行排序,这里的a数组里所有的元素必须实现comparable 接口

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值