热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

comparable与comparator

先来说说基本的认识:comparable与comparator两者都是接口,实现的方法都是对对象进行排序。comparable这个词是以able结尾的&

 

        先来说说基本的认识:comparable与comparator 两者都是接口,实现的方法都是对对象进行排序。 comparable  这个词是以able结尾的,说明是一种能力,一种属性,可参见 Serializable,继承了该接口就可以实现序列化了。那么继承   comparable 并且重写compareTo方法,就可以让该类的对象拥有与其他同类对象的比较能力。  这是该类对象所具备的能力。

      而comparator相当与从第三方的角度进行对对象的比较,类的本身不需要继承该接口。

     那么什么情况下会需要comparator接口呢?

     1.所比较的类没有继承comparable,但是又需要比较的时候

     2.所比较的类没有继承comparable并且也重写了比较方法,但是在业务上该比较方法不适用,需要自己定制一个。

 

代码分析:

1.comparable

  先定义一个商品类,继承comparable,重写compareTo方法

public class Goods implements Comparable {
private String name;
private double price;

public Goods() {

}

public Goods(String name, double price) {
this.name = name;
this.price = price;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public double getPrice() {
return price;
}

public void setPrice(double price) {
this.price = price;
}

//指明商品比较大小的方式,按照价格从低到高排序,如果出现价格相同的,再按照产品名称从低到高排序
@Override
public int compareTo(Object o) {
if(o instanceof Goods ){
Goods goods =(Goods)o;
if (this.price > goods.price) {
return 1;
}else if(this.price return -1;
}else
//return 0;
return this.name.compareTo(goods.name);
}
throw new RuntimeException("传入的数据类型不一致");
}
}

  

public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub

List list &#61; new ArrayList<>();
Goods goods &#61; new Goods("内裤", 33);
Goods goods2 &#61; new Goods("丁字裤", 31);
Goods goods3 &#61; new Goods("长裤", 32);
list.add(goods);
list.add(goods2);
list.add(goods3);
System.err.println(goods.compareTo(goods2));
//该方法会调用定义的比较器
Collections.sort(list);
list.stream().forEach(Element-> System.err.println(Element.getName()));
// 丁字裤、 长裤、内裤
}
}

    2.

public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub

List list &#61; new ArrayList<>();
Goods goods &#61; new Goods("内裤", 33);
Goods goods2 &#61; new Goods("丁字裤", 31);
Goods goods3 &#61; new Goods("长裤", 32);
list.add(goods);
list.add(goods2);
list.add(goods3);

Collections.sort(list, new Comparator() {
&#64;Override
public int compare(Goods o1, Goods o2) {
// TODO Auto-generated method stub
return 0;
}
});
}
}

    

public class Demo {
public static void main(String[] args) throws ClassNotFoundException {
// TODO Auto-generated method stub

List list &#61; new ArrayList<>();
Goods goods &#61; new Goods("内裤", 33);
Goods goods2 &#61; new Goods("丁字裤", 31);
Goods goods3 &#61; new Goods("长裤", 32);
list.add(goods);
list.add(goods2);
list.add(goods3);

Compare compare &#61; new Compare();
int a &#61; compare.compare(goods, goods2);
System.err.println(a);
}
}
class Compare implements Comparator{
&#64;Override
public int compare(Goods o1, Goods o2) {
// TODO Auto-generated method stub
if(o1.getPrice() > o2.getPrice())
return 1;
else
return 0;
}

}

 



推荐阅读
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
author-avatar
feng2502863897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有