欢迎光临北大青鸟佛山华大校区

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

5分钟搞定JavaComparable接口

2017-06-14

来源:

  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;

  }

  

开班信息

开班课程 人数 了解详情
高端名企定向委培班 剩余名额3 课程介绍
ACCP8.0软件培训班 剩余名额8 课程介绍
短期冲刺班 剩余名额2 课程介绍
项目精英班 剩余名额1 课程介绍
NET课程重点班 剩余名额6 课程介绍
软件开发精英班 剩余名额2 课程介绍
JAVA特招班 剩余名额10 课程介绍

免费试听

试听课程 了解详情
高端名企定向委培班 试听详情
ACCP8.0软件培训班 试听详情
短期冲刺班 试听详情
项目精英班 试听详情
NET课程重点班 试听详情
软件开发精英班 试听详情
JAVA特招班 试听详情

姓名:

电话:

最新就业

姓名 就业岗位 就业企业
占乐乐 软件工程师 关务通网络科技公司
张浩峰 软件工程师 嘉域网络科技有限公司
卜锡龙 软件工程师 必应科技有限公司
梁嘉嘉 软件工程师 林氏木业
何伟煊 java工程师 金政信息科技
张雅涵 NET工程师 国贸集团股份有限公司
张默 项目组长 极宇舟天有限公司
张婧涵 NET工程师 大族激光有限公司
张洪文 NET工程师 诚迈科技有限公司
王玥婷 java技术顾问岗位 百纳威尔有限公司
王鸿轩 Java开发岗位 爱卡智能
邓安志 软件开发工程师 美的集团
何浚宏 软件开发课程工程师 东和科技有限公司
黄隆 软件开发顾问 建发股份公司
刘应琴 软件开发工程师 国美集团
刘雨林 java工程师 唯品会科技有限公司
彭子昂 Java开发 爱卡智能有限公司
  • 佛山华大校区
  • 厦门软件园校区
  • 福州新生代校区
  • 厦门课工场
  • 北大青鸟佛山华大校区
  • 地址:广东省佛山市禅城区祖庙路1号富荣大厦4楼
  • 乘车路线:旋宫酒店站、亲仁路站、松风路站、莲花站
  • 招生电话:0757-88726000    4006-989-522
  • 网址:www.foshanbdqn.com
  • 北大青鸟厦门软件园校区
  • 地址:厦门市思明区软件园二期观日路48号(IT实训32号)
  • 乘车路线:软件园站、软件园南门、软件园东二门站、观日路口
  • 招生电话:0592-5920811    4000-470-150
  • 网址:www.xmbdqn.com
  • 北大青鸟福州新生代校区
  • 地址:福州市鼓楼区东大路恒裕大厦三楼
  • 乘车路线:塔头站、东水路口站、八方大厦站
  • 招生电话:0591-87880522    400-9966-370
  • 网址:www.0591bdqn.com
  • 北大青鸟厦门课工场
  • 地址:厦门市思明区软件园二期观日路48号(IT实训32号)
  • 乘车路线:软件园站、软件园南门、软件园东二门站、观日路口
  • 招生电话:0592-5920811    4000-470-150
  • 网址:www.xmbdqn.com
  • 备案号:粤ICP备17103049号-4
  • 版权所有:佛山市禅城区华大计算机职业技能培训学校

佛山华大校区微信公众平台

佛山北大青鸟