欢迎光临北大青鸟福州新生代校区

  5分钟搞定JavaComparable接口

  这篇文章是Java8课程中关于CleanCode原则的一部分。

  在这篇文章中,我们要聊一聊JavaComparable接口。

  还有一个不错的视频可以点这里。

  Comparable接口时用来干什么的呢?

  我们应该如何对事物进行比较和排序?这问题听上去有点莫名其妙,但我希望你认真考虑一下。

  我们要怎样对它们进行排序呢?我们希望通过重量进行排序吗?如果是的话,排序是从轻到重还是从重到轻?当我们对它们进行排序的时候,我们需要反复比较两个苹果的重量,直到正确地排好所有的苹果。苹果1比苹果2重?那它比苹果3重吗?我们需要不断比较,直到完成排序。Comparable接口可以帮助我们实现这一目标。Comparable本身不能对对象进行排序,但接口定义的方法intcompareTo(T)可以。

  compareTo(T)如何工作

  让我们通过使用compareTo()方法来看看哪个苹果比较重,开始吧。

  compareTo()方法的工作原理是返回一个int值或正,或负,或为零。它通过调用作为参数的对象来比较对象。负数表示调用的对象比参数“轻”。如果我们用大小来比较苹果,那么上面的调用会返回一个负数,例如-400,因为红苹果比青苹果小。如果两个苹果重量相等,那么调用将返回0。如果红苹果更重,那么compareTo()将返回一个正数,例如68。

  compareTo()的灵活性

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

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

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

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

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

  例1:通过重量排序苹果

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

  Collections.sort(apples);

  例4

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

  让我们开始写苹果类吧。

  publicclassAppleimplementsComparable{

  privateStringvariety;

  privateColorcolor;

  privateintweight;

  @Override

  publicintcompareTo(Appleother){

  if(this.weight

  return-1;

  }

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

  return0;

  }

  return1;

  }

  }

  例5

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

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

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

  publicclassAppleimplementsComparable{

  privateStringvariety;

  privateColorcolor;

  privateintweight;

  @Override

  publicintcompareTo(Appleother){

  intresult=this.variety.compareTo(other.variety);

  if(result!=0){

  returnresult;

  }

  

我的位置: 首页 >> 5分钟搞定JavaComparable接口

2018-09-22

来源:


 

在线答疑更多++

热门专题更多++

福建省福州市鼓楼区东大路恒裕大厦北大青鸟新生代校区

地址:福建省福州市鼓楼区东大路恒裕大厦三楼

电话:400-9966-370   0591-87880522

网址: www.0591bdqn.com

福州校区乘车路线:塔头站、东水路口站、八方大厦站

北大青鸟福州新生代校区公众平台

福州北大青鸟