Toc
  1. 前言
  2. 元素的比较
    1. Comparable
    2. Comparator
Toc
0 results found
Espada
《码出高效》系列笔记(四):元素的比较

良好的编码风格和完善统一的规约是最高效的方式。

前言

本篇汲取了本书中较为精华的知识要点和实践经验加上读者整理,作为本系列里的第四篇章第三节:数据结构与集合的元素的比较篇。

本系列目录

元素的比较

Comparable

Java中两个对象相比较的方法通常用在元素排序中,常用的两个几口分别是Comparable和Comparator,前者是自己和自己比;后者是第三方比较器,类似于平台性质的比较器。

我们熟知的Integer和String实现的就是Comparable的自然排序。

假设在一个搜索列表中进行排序时,先根据相关度排序,然后再根据浏览数排序,那么可以利用Comparable这样写:

public class SearchResult implements Comparable<EzCodingTest>{

// 相关度
int relativeRatio;
long count;
int recentOrders;

public SearchResult(int relativeRatio, long count) {
this.relativeRatio = relativeRatio;
this.count = count;
}

@Override
public int compareTo(EzCodingTest o) {
if (this.relativeRatio != o.relativeRatio) {
return this.relativeRatio > o.relativeRatio ? 1 : -1;
}
if (this.count != o.count) {
return this.count > o.count ? 1 : -1;
}
return 0;
}

public static void main(String[] args) {

EzCodingTest result1 = new EzCodingTest(10, 100);
EzCodingTest result2 = new EzCodingTest(20, 1);
System.out.println(result1.compareTo(result2));
}

}

在实现Comparable时,我们发现了需要加上泛型限定,public class EzCodingTest implements Comparable,这样的话,可以在编译阶段就判断是否符合该定义的对象。当排序方法不符合当前的业务要求,重写该比较方法compareTo,因为开闭原则的关系,已交付的类进行修改是有很大风险的。所以我们需要在外部定义比较器:Comparator。

Comparator

假如你刚写完上面的代码,产品狗过来和宁说:现在搜索的权重改辣!现在最近的订单数的权重最高,抓紧改吧,加班搞完半夜上线~!

这时候你应该怎么做呢,继续修改刚才的代码?不,正确的做法是:

对产品狗使用神の救♂济。

vans之后我们害是得van成任务,所以俺们可以搞个外部比较器SearchResultComparator剥离出来。

public class SearchResultComparator implements Comparator<EzCodingTest>{

// 相关度
int relativeRatio;
long count;
int recentOrders;

public SearchResultComparator(int relativeRatio, long count) {
this.relativeRatio = relativeRatio;
this.count = count;
}

@Override
public int compare(EzCodingTest o1, EzCodingTest o2) {

if (o1.recentOrders != o2.recentOrders) {
return o1.recentOrders > o2.recentOrders ? 1 : -1;
}

if (o1.relativeRatio != o2.relativeRatio) {
return o1.relativeRatio > o2.relativeRatio ? 1 : -1;
}

if (o1.count != o2.count) {
return o1.count > o2.count ? 1 : -1;
}
return 0;
}

public static void main(String[] args) {

EzCodingTest result1 = new EzCodingTest(70, 100);
EzCodingTest result2 = new EzCodingTest(20, 1);
System.out.println(result1.compare(result1, result2));
}
}
龙鸣
"老罗"
本文作者:Espada
版权声明:本文首发于Espada的博客,转载请注明出处!