Comparable 自然排序
Comparable 在 java.lang 包下,是一个接口,内部只有一个方法 compareTo():
compareTo 方法的返回值有三种情况:
- e1.compareTo(e2) > 0 即 e1 > e2
- e1.compareTo(e2) = 0 即 e1 = e2
- e1.compareTo(e2) < 0 即 e1 < e2
实现了 Comparable 接口的 List 或则数组可以使用 Collections.sort()
或者 Arrays.sort()
方法进行排序。
实现了 Comparable 接口的对象才能够直接被用作 SortedMap (SortedSet) 的 key,要不然得在外边指定 Comparator 排序规则。
因此自己定义的类如果想要使用有序的集合类,需要实现 Comparable 接口,比如:
**
* description: 测试用的实体类 书, 实现了 Comparable 接口,自然排序
* <br/>
* author: shixinzhang
* <br/>
* data: 10/5/2016
*/
public class BookBean implements Serializable, Comparable {
private String name;
private int count;
public BookBean(String name, int count) {
this.name = name;
this.count = count;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
/**
* 重写 equals
* @param o
* @return
*/
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof BookBean)) return false;
BookBean bean = (BookBean) o;
if (getCount() != bean.getCount()) return false;
return getName().equals(bean.getName());
}
/**
* 重写 hashCode 的计算方法
* 根据所有属性进行 迭代计算,避免重复
* 计算 hashCode 时 计算因子 31 见得很多,是一个质数,不能再被除
* @return
*/
@Override
public int hashCode() {
//调用 String 的 hashCode(), 唯一表示一个字符串内容
int result = getName().hashCode();
//乘以 31, 再加上 count
result = 31 * result + getCount();
return result;
}
@Override
public String toString() {
return "BookBean{" +
"name='" + name + '\'' +
", count=" + count +
'}';
}
/**
* 当向 TreeSet 中添加 BookBean 时,会调用这个方法进行排序
* @param another
* @return
*/
@Override
public int compareTo(Object another) {
if (another instanceof BookBean){
BookBean anotherBook = (BookBean) another;
int result;
//比如这里按照书价排序
result = getCount() - anotherBook.getCount();
//或者按照 String 的比较顺序
//result = getName().compareTo(anotherBook.getName());
if (result == 0){ //当书价一致时,再对比书名。 保证所有属性比较一遍
result = getName().compareTo(anotherBook.getName());
}
return result;
}
// 一样就返回 0
return 0;
}
Comparator 定制排序
Comparator 在 java.util 包下,也是一个接口,JDK 1.8 以前只有两个方法:
public interface Comparator<T> {
public int compare(T lhs, T rhs);
public boolean equals(Object object);
}
总结
Java 中的两种排序方式:
- Comparable 自然排序。(实体类实现)
- Comparator 是定制排序。(无法修改实体类时,直接在调用方创建)
同时存在时采用 Comparator(定制排序)的规则进行比较。
对于一些普通的数据类型(比如 String, Integer, Double…),它们默认实现了Comparable 接口,实现了 compareTo 方法,我们可以直接使用。
而对于一些自定义类,它们可能在不同情况下需要实现不同的比较策略,我们可以新创建 Comparator 接口,然后使用特定的 Comparator 实现进行比较。
这就是 Comparable 和 Comparator 的区别。
转载于: https://blog.youkuaiyun.com/u011240877/article/details/53399019