compareTo()的灵活性

如果我们反复调用上面的compareTo()方法,那么我们可以通过大小来排序,这很棒,但并非故事的结束。如果我们想通过颜色来给苹果排序呢?抑或是重量?我们也可以做到。关键是,我们的客户——让我们叫他胖子农夫(见例3),需要在我们开始开发之前精确定义需要如何对苹果进行排序。

例3

他可以通过回答这两个问题来做到这一点:

他希望苹果如何进行排序?他希望我们比较什么特征?

在那样的环境中,“小于”,“等于”和“大于”指的是什么意思?

也可以使用多个特征,这个后面我们会讲。

例1:通过重量排序苹果

在第一个例子中,我们将通过重量对苹果排序。只需要一行代码。

Collections.sort(apples);

例4

上面的代码行可以为我们做到所有的排序工作,只要我们事先定义好如何对苹果进行排序(这就需要多行代码了)。

让我们开始写苹果类吧。

public class Apple implements Comparable {

private String variety;

private Color color;

private int weight;

@Override

public int compareTo(Apple other) {

if (this.weight < other.weight) {

return -1;

}

if (this.weight == other.weight) {

return 0;

}

return 1;

}

}

例5

这是Apple类的第一个版本。由于我们使用的是compareTo方法,并且正在排序苹果,所以我实现了Comparable接口。在这第一个版本中,我们通过重量比较对象。在我们的compareTo()方法中,我们写一个if条件,说明如果这个苹果的重量小于其他的苹果,那么返回一个负数,为了保持简单,我们假定它为-1。请记住,这意味着这个苹果轻于Apple ‘other’。在第二个if语句中,我们要说明,如果苹果重量相等,那么返回一个0。当然,如果这个苹果既不是更轻,又不是一样重,那就只能比其他苹果更重了。在这种情况下,我们返回一个正数,假定为1。

例2:通过多个特征排序苹果

正如我前面提到的,我们还可以使用compareTo()比较多个特征。比方说,我们第一通过品种排序苹果,但如果两个苹果是同一品种,那么我们就按颜色排序。最后,如果这两个特性相同,那么我们将按重量排序。虽然我们可以手动实现这件事,就像我在最后一个例子中做的那样,但是其实可以用一种简洁得多的方式实现。一般来说,最好是重用现有的代码,而不是自己写。我们可以在Integer、String和枚举类中使用compareTo方法来比较值。由于我们没有使用Integer对象,用了int,所以我们不得不使用来自于Integer包装器类的一个静态的helper方法来比较两个值。

public class Apple implements Comparable {

private String variety;

private Color color;

private int weight;

@Override

public int compareTo(Apple other) {

int result = this.variety.compareTo(other.variety);

if (result != 0) {

return result;

}

if (result == 0) {

result = this.color.compareTo(other.color);

}

if (result != 0) {

return result;

}

if (result == 0) {

result = Integer.compare(this.weight, other.weight);

}

return result;

}

}

例6

在例6中,我们比较了客户指定的苹果的第一特性,它们的品种。如果compareTo()调用的结果为非零,那么我们返回值。否则,我们调用另一个compareTo()直到得到一个非零值,或者直到已经比较完这三个特征。尽管此代码可以工作,但它不是最有效或干净的解决方案。在例3中,我们重构我们的代码,使其更简单。

@Override

public int compareTo(Apple other) {

int result = this.variety.compareTo(other.variety);

if (result == 0) {

result = this.color.compareTo(other.color);

}

if (result == 0) {

result = Integer.compare(this.weight, other.weight);

}

return result;

}

例7

正如你所看到的,这大大减少了代码,并且每一次比较只要一行代码。如果一个compareTo()调用的结果是零,那么我们就转移到下一个相同if语句的比较中。顺便说一句,这是成为Clean Coder的一个很好的例子。通常情况下,你不需要立即写出干净的代码;你可以从一个粗略的想法开始,使其可以工作,然后不断改进,直到你尽可能得让它干净就可以了。

Comparable,hashCode以及Equals

你可能会注意到compareTo()看起来有点像hashCode()和equals()方法。但是,它们有一个重要的区别。对于hashCode()和equals()方法,比较个体属性的顺序不影响返回的值,但是,在compareTo()中,通过你比较对象的顺序来定义对象的顺序。

结论

在结论中我只想强调Comparable接口是多么的重要。它既用于java.util.Arrays,也用于java.util.Collections实用程序类,来排序元素和搜索排序集合中的元素。使用TreeSet和Tree Map,就更简单了——想要它们会自动排序必须实现Comparable接口的元素。

java comparable接口作用_Java Comparable 接口相关推荐

  1. java集合框架中抽象有序列表的接口是_JAVA基础接口集合框架

    接口 -------------------------------------------------------------------------------- 一.接口(是一种规范) 1.接口 ...

  2. java对象序列化作用_Java学习之——理解对象序列化

    Java的对象序列化就是把对象写入到输出流中,用来存储或传输:反序列化就是从输入流中读取对象.简单的来说是指将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 ...

  3. java关键字的作用_java关键字及其作用

    java关键字及其作用 java 关键字及其作用 一. 关键字总览:关键字 含义abstract 表明类或者成员方法具有抽象属性assert 用来进行程序调试boolean 基本数据类型之一,布尔类型 ...

  4. java 主类作用_JAVA 关键字及其作用解释

    3. 程序控制语句 1) break 跳出,中断 break 关键字用于提前退出 for.while 或 do 循环,或者在 switch 语句中用来结束 case 块. break 总是退出最深层的 ...

  5. java comparable接口作用_Java 中 Comparable 接口的意义和用法

    一, 为何需要实现Comparable接口 我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法. 当然, 其中最长用的莫过于排序了(Collections ...

  6. java compareto 返回值_Java comparable接口及compareTo返回值所决定的升序降序问题

    我们在学习java基础的时候知道,基本数据类型数组可以直接调动Arrays类的静态sort方法,然后输出. 例如: int iArr[] = {1,2,4,6};  Arrays.sort(iArr) ...

  7. java 接口 静态方法_Java 8 接口静态方法

    Java 8 除了给接口带来了 默认方法之外,还给接口带来了 静态方法.而且,Java 8 中的静态方法还可以有具体的实现. 我们都知道,在 Java 7 及之前的版本中,接口 interface 是 ...

  8. java 继承和内部类_Java自学-接口与继承 内部类

    Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接 ...

  9. java lock代码写法_java Lock接口详解及实例代码

    java  lock接口 java.util.concurrent.locks 接口lock public interface loce loce实现提供了比使用synchronized方法和语句可获 ...

最新文章

  1. 【每日一念经】算法岗面经,一万字面试经验你确定不看?
  2. 最长不含重复字符的子字符串
  3. 这是一个测试rss的内容哦
  4. LeetCode OJ - Recover Binary Search Tree
  5. c++ 多重背包状态转移方程_动态规划入门——详解经典问题零一背包
  6. 5 计算机组成原理第四章 指令系统
  7. django-演练-老师列表页的显示-通过table显示
  8. Cisco网络管理的35个常见问题及解答
  9. Java转码amr_java amr格式转mp3格式(完美解决Linux下转换0K问题)
  10. php网站怎么看用户名,首页登录后怎么在首页显示用户名以及隐藏登录框?
  11. css子元素和后代元素选择器
  12. java中钟摆运动的代码_仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)...
  13. 将Flutter添加到现有应用——过程中遇到的问题
  14. 超高分辨率大屏拼接工作站硬件选型
  15. VMware Workstation Pro新建虚拟机的操作步骤
  16. Spring中常用的SpEl表达式
  17. Linux系统结构以及各类命令的汇总
  18. SQL语句把一个表中的a字段的值赋值到另一个字段b
  19. HTML5前端视频_React视频-张晓飞-专题视频课程
  20. 《卡尔琳记事本》,召唤师的故事,周更

热门文章

  1. 【CentOS】如何在线安装pcre?
  2. Uboot分析(三)
  3. 基于Exchange 2003的搭建高可用的邮件平台 之一:群集的配置
  4. git clone 报错 “Clone failed: Authentication failed for xxxxx”(做过测试)
  5. SqlServer千万级以上的数据表查询优化方案《冷热数据库分离》的思路
  6. php轻量级的性能分析工具xhprof的安装使用
  7. Laravel安装步骤
  8. PHP的引用传值值传递
  9. chrome浏览器无法上网_浏览器无法上网
  10. h5移动端如何让页面强制横屏