java comparable接口作用_Java Comparable 接口
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 接口相关推荐
- java集合框架中抽象有序列表的接口是_JAVA基础接口集合框架
接口 -------------------------------------------------------------------------------- 一.接口(是一种规范) 1.接口 ...
- java对象序列化作用_Java学习之——理解对象序列化
Java的对象序列化就是把对象写入到输出流中,用来存储或传输:反序列化就是从输入流中读取对象.简单的来说是指将那些实现了Serializable接口的对象转换成一个字节序列,并能够在以后将这个字节序列 ...
- java关键字的作用_java关键字及其作用
java关键字及其作用 java 关键字及其作用 一. 关键字总览:关键字 含义abstract 表明类或者成员方法具有抽象属性assert 用来进行程序调试boolean 基本数据类型之一,布尔类型 ...
- java 主类作用_JAVA 关键字及其作用解释
3. 程序控制语句 1) break 跳出,中断 break 关键字用于提前退出 for.while 或 do 循环,或者在 switch 语句中用来结束 case 块. break 总是退出最深层的 ...
- java comparable接口作用_Java 中 Comparable 接口的意义和用法
一, 为何需要实现Comparable接口 我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法. 当然, 其中最长用的莫过于排序了(Collections ...
- java compareto 返回值_Java comparable接口及compareTo返回值所决定的升序降序问题
我们在学习java基础的时候知道,基本数据类型数组可以直接调动Arrays类的静态sort方法,然后输出. 例如: int iArr[] = {1,2,4,6}; Arrays.sort(iArr) ...
- java 接口 静态方法_Java 8 接口静态方法
Java 8 除了给接口带来了 默认方法之外,还给接口带来了 静态方法.而且,Java 8 中的静态方法还可以有具体的实现. 我们都知道,在 Java 7 及之前的版本中,接口 interface 是 ...
- java 继承和内部类_Java自学-接口与继承 内部类
Java 内部类 内部类分为四种: 非静态内部类 静态内部类 匿名类 本地类 步骤 1 : 非静态内部类 非静态内部类 BattleScore "战斗成绩" 非静态内部类可以直接 ...
- java lock代码写法_java Lock接口详解及实例代码
java lock接口 java.util.concurrent.locks 接口lock public interface loce loce实现提供了比使用synchronized方法和语句可获 ...
最新文章
- 【每日一念经】算法岗面经,一万字面试经验你确定不看?
- 最长不含重复字符的子字符串
- 这是一个测试rss的内容哦
- LeetCode OJ - Recover Binary Search Tree
- c++ 多重背包状态转移方程_动态规划入门——详解经典问题零一背包
- 5 计算机组成原理第四章 指令系统
- django-演练-老师列表页的显示-通过table显示
- Cisco网络管理的35个常见问题及解答
- Java转码amr_java amr格式转mp3格式(完美解决Linux下转换0K问题)
- php网站怎么看用户名,首页登录后怎么在首页显示用户名以及隐藏登录框?
- css子元素和后代元素选择器
- java中钟摆运动的代码_仿真树叶飘落效果的实现(精灵旋转、翻转、钟摆运动等综合运用)...
- 将Flutter添加到现有应用——过程中遇到的问题
- 超高分辨率大屏拼接工作站硬件选型
- VMware Workstation Pro新建虚拟机的操作步骤
- Spring中常用的SpEl表达式
- Linux系统结构以及各类命令的汇总
- SQL语句把一个表中的a字段的值赋值到另一个字段b
- HTML5前端视频_React视频-张晓飞-专题视频课程
- 《卡尔琳记事本》,召唤师的故事,周更