1. Comparator 和 Comparable 同样的地方

他们都是java的一个接口, 而且是用来对自己定义的class比較大小的,

什么是自己定义class: 如 public class Person{ String name; int age }.

当我们有这么一个personList,里面包括了person1, person2, persion3....., 我们用Collections.sort( personList ), 是得不到预期的结果的. 这时肯定有人要问, 那为什么能够排序一个字符串list呢:

如 StringList{"hello1" , "hello3" , "hello2"}, Collections.sort( stringList ) 能够得到正确的排序, 那是由于 String 这个对象已经帮我们实现了 Comparable接口 , 所以我们的 Person 假设想排序, 也要实现一个比較器。
   
2. Comparator 和 Comparable 的差别 Comparable Comparable 定义在 Person类的内部: public class Persion implements Comparable {..比較Person的大小..},  由于已经实现了比較器,那么我们的Person如今是一个能够比較大小的对象了,它的比較功能和String全然一样,能够随时随地的拿来比較大小,由于Person如今自身就是有大小之分的。 Collections.sort(personList)能够得到正确的结果。 Comparator Comparator 是定义在Person的外部的, 此时我们的Person类的结构不须要有不论什么变化,如 public class Person{ String name; int age }, 然后我们另外定义一个比較器: public PersonComparator implements Comparator() {..比較Person的大小..}, 在PersonComparator里面实现了怎么比較两个Person的大小. 所以,用这样的方法,当我们要对一个 personList进行排序的时候, 我们除了了要传递personList过去, 还须要把PersonComparator传递过去,由于怎么比較Person的大小是在PersonComparator里面实现的, 如: Collections.sort( personList , new PersonComparator() ). 3. Comparator 和 Comparable 的实例 Comparable: 实现Comparable接口要覆盖s=17470874779923938404&entry=1&q=compareTo" class="bdcs-inlinelink" target="_blank">compareTo方法, 在compareTo方法里面实现比較:
public class Person implements Comparable {
     String name;
     int age
     public int compareTo(Person another) {
          int i = 0;
          i = name.compareTo(another.name); // 使用字符串的比較
          if(i == 0) { // 假设名字一样,比較年龄, 返回比較年龄结果
               return age - another.age;
          } else {
               return i; // 名字不一样, 返回比較名字的结果.
          }
     }
}
   这时我们能够直接用 Collections.sort( personList ) 对其排序了. Comparator: 实现Comparator须要覆盖 compare 方法:
public class Person{
     String name;
     int age
} class PersonComparator implements Comparator { 
     public int compare(Person one, Person another) {
          int i = 0;
          i = one.name.compareTo(another.name); // 使用字符串的比較
          if(i == 0) { // 假设名字一样,比較年龄,返回比較年龄结果
               return one.age - another.age;
          } else {
               return i; // 名字不一样, 返回比較名字的结果.
          }
     }
}
   Collections.sort( personList , new PersonComparator()) 能够对其排序  4:总结 两种方法各有优劣, 用Comparable 简单, 仅仅要实现Comparable 接口的对象直接就成为一个能够比較的对象,可是须要改动源码, 用Comparator 的优点是不须要改动源码, 而是另外实现一个比較器, 当某个自己定义的对象须要作比較的时候,把比較器和对象一起传递过去就能够比大小了, 而且在Comparator 里面用户能够自己实现复杂的能够通用的逻辑,使其能够匹配一些比較简单的对象,那样就能够节省非常多反复劳动了。

comparator接口与Comparable接口的差别的更多相关文章

  1. Java中Comparator接口和Comparable接口的使用

    普通情况下在实现对对象元素的数组或集合进行排序的时候会用到Comparator和Comparable接口,通过在元素所在的类中实现这两个接口中的一个.然后对数组或集合调用Arrays.sort或者Co ...

  2. comparator接口与Comparable接口的区别

    1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Pe ...

  3. 关于comparator接口和comparable接口以及它们各自的方法compare()和compareTo()

    在今天做的LeetCode的题中有两道都出现了利用接口实现对象的排序.两题的相关链接: 1.利用comparable接口对对象排序 2.利用comparator接口实现排序 因为之前都没接触过这两个接 ...

  4. Java Comparator方法 和 Comparable接口

    默认的排序方法: 让类继承Comparable接口,重写compareTo方法. 示例代码: package com.imooc.collection; import java.util.HashSe ...

  5. Java 之 比较器( Comparator接口与 Comparable 接口)

    一.定制排序:java.util.Comparator 接口 强行对某个对象 collection 进行整体排序 的比较函数.可以将 Comparator 传递给 sort 方法(如 Collecti ...

  6. 实现Comparator接口和Comparable接口,以及Map按value排序 ,map遍历

    继承Comparator接口,重写compare()方法 import java.util.ArrayList; import java.util.Arrays; import java.util.C ...

  7. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  8. Java中 Comparator接口 与Comparable 的区别

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt159 comparator接口与Comparable接口的区别 1. Com ...

  9. Comparable 接口与Comparator的使用的对比

    package com.yhqtv.java; import org.junit.Test; import java.util.Arrays; import java.util.Comparator; ...

随机推荐

  1. 79.QT解决迷宫问题(面向过程与面向对象)

    面向过程: 创建一个类继承dialog,mydialog,添加两个变量 #ifndef MYDIALOG_H #define MYDIALOG_H #include <QDialog>&g ...

  2. POJ 3174 暴力枚举

    思路: 暴力枚举三个点 判一判 搞定 (x1*y1=x2*y2) x1.y1.x2.y2为他们两两的差 //By SiriusRen #include <cstdio> using nam ...

  3. 认识Linux瘦客户机

           (本文完整版见http://os.51cto.com/art/201001/181448.htm)        随着Linux的发展,以及网络计算技术的发展和逐步深入的云计算,基于Li ...

  4. maven项目引入sqljdbc4 找不到包的完美 解决方案

    今天碰到了这个问题,解决了,顺便做一下记录.首先来 重现 一下这个问题,maven install报错,说 找不到这个包,但是其实 我已经安装了. 我们 再来 看看 maven本地仓库里面有 什么,这 ...

  5. ifup&&ifdown --- 激活/关闭指定的网络接口。

    ifup命令用于激活指定的网络接口. ifup eth0 #激活eth0 ifdown命令用于禁用指定的网络接口. ifdown eth0 #禁用eth0

  6. Android中级第十讲--相机录像和查看系统相册图片

    博客出自:http://blog.csdn.net/liuxian13183,转载注明出处! All Rights Reserved ! 录像比较简单,开始录制: myCamera.unlock(); ...

  7. angular 子组件与父组件通讯

    1. 子组件app-sidebar.compnent.html (click)="goProject()"设置点击事件 <mat-list-item [routerLink] ...

  8. Scala——构造函数

    Scala的构造函数分为主构造函数和辅助构造函数. 辅助构造函数 辅助构造函数比较容易理解,它们同C++和Java的构造函数十分类似,只有两处不同: 1.辅助构造函数的名称为this,这主要是考虑到在 ...

  9. STL中erase()的陷阱

    最近在刷stl源码剖析这本书时,对于vector的erase()函数引起了我的注意 在删除单个元素时是这样定义的: iterator erase(iterator position){ !=end() ...

  10. Unity3D教程:静态调用C#的dll

    就像使用.net自带的那些程序集一样.加入Reference,然后使用就可以. 因为windows环境下的Unity编译脚本时,本质上还是生成.net程序集.并且其C#脚本编程事实上就是.net C# ...