文章分类:Java编程
java的Comparator和Comparable
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式真现对象排序或自定义排序。
     一、Comparator
强行对某个对象collection进行团体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
接口方法:
  /**
   * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
   */
  int compare(Object o1, Object o2);
案例:
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator<String> {
  public int compare(String o1, String o2) {
    return toInt(o1) - toInt(o2);
  }
  private int toInt(String str) {
    str = str.replaceAll("一", "1");
    str = str.replaceAll("二", "2");
    str = str.replaceAll("三", "3");
  
    return Integer.parseInt(str);
  }
  /**
   * 测试方法
   */
  public static void main(String[] args) {
    String[] array = new String[] { "一二", "三", "二" };
    Arrays.sort(array, new SampleComparator());
    for (int i = 0; i < array.length; i++) {
      System.out.println(array[i]);
    }
  }
}
  &nb交通银行sp;   2、Comparable
强行对真现它的每一个类的对象进行团体排序,真现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
接口方法:
  /**
   * @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。
   */
  int compareTo(Object o);
假设对象User,需要按年事排序:
public class User {
  private String id;
  private int age;
  public User(String id, int age) {
    this.id = id;
    this.age = age;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
}
改造后的对象:
import java.util.Arrays;
public class User implements Comparable<User> {
  private String id;
  private int age;
  public User(String id, int age) {
    this.id = id;
    this.age = age;
  }
  public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  public String getId() {
    return id;
  }
  public void setId(String id) {
    this.id = id;
  }
  public int compareTo(User u) {
    return this.age - u.getAge();
  }
  /**
   * 测试方法
   */
  public static void main(String[] args) {
    User[] users = new User[] { new User("a", 30), new User("b", 20) };
    Arrays.sort(users);
    for (int i = 0; i < users.length; i++) {
      User user = users[i];
      System.out.println(user.getId() + " " + user.getAge());
    }
  }
}
      三、Comparator和Comparable的区别
  先看一下使用Comparator对User集合真现排序的方式:一个类真现了Camparable接口则表明这个类的对象之间是可以互相比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的真现,将算法和数据分离,Comparator也能够在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有真现Comparable,可以通过Comparator来真现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等
在TreeSet和TreeMap中添加的自定义对象必须真现Comparable接口

------------------------------------------------------------

关于援用数据类型的排序(自然排序和客户化排序):
1.对象本身真现Comparable接口,那么该类的真例就是可以排序的(真现其comparTo()方法).

只要真现了Comparable接口,就可以调用Collections的sort方法对集合中的元素排序.
2.真现Comparator接口的一个真例也能够真现排序功能.

看一下Comparator的全部内容:
public interface Comparator {
  int compare(Object o1, Object o2);
  boolean equals(Object obj);
}
定义了两个方法,我们一般都只需要真现compare方法。
为何呢?
因为所有自定义类默认extends Object,而Object中已经将equals()真现
Comparator一般都作为一个匿名类出现,对于没有真现Comparable的对象的集合,排序的时候
需要指定一个Comparator.
这里举例说明
对于真现了Comparable的类(自然排序)我们就用最简单的Integer
List list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(53));
list.add(new Integer(34));
Collections.sort(list);
对于没有真现Comparable的,我们就用Object,按照hashCode大小来排序.
List list= new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
                    return (o1.hashCode()-o2.hashCode());
                })
这里定义了一个排序规则,以匿名类的形式出现,当然你也能够定义一个自定义的类真现Comparator,
这样这个“排序规则”就能得以保存。
那Comparable 和 Comparator 接口有什么区别呢?
“口语文”的解释:用自定义类真现Comparable接口,那么这个类就具有排序功能,Comparable和具体你要进行排序的类的真例邦定。而Comparator比较灵活,它没有和任何类绑定,真现它的自定义类仅仅定义了一种排序方式或排序规则。不言而喻,这种方式比较灵活。我们的要排序的类可以分别和多个真现Comparator接口的类绑定,从而达到可以按自己的意愿真现按多种方式排序的目的。Comparable——“静态绑定排序”,Comparator——“动态绑定排序”。

...的Comparator和Compa相关推荐

  1. java8 Lambda表达式的应用(函数式接口、lambda表达式,方法引用及Stream API)

    之前写了一篇博客简单介绍了一下java 8发布新增的一些特性功能,java 8在2014年发布,距今也不少年了,但是lambda表达式使用并不熟练,现在一边学习,一边记录一下. 目录 一.Lambda ...

  2. sort()排序(Comparable、Comparator)

    在收集对象之后,对对象进行排序是常用的动作.不用亲自操作排序算法Java.util. Collections提供有sort()方法.由于必须有索引才能进行排序,因此 Collections的sort( ...

  3. 集合框架-Comparator和Comparable的区别

    Comparator也叫外部比较器,常在使用Collections工具类进行集合排序的时候使用.外部比较器Comparator可以理解为一个专用的比较器,当集合中的对象不支持自比较或者比较的功能不能满 ...

  4. Comparator 和 Comparable

    Comparator 和 Comparable 比较 Comparable是排序接口:若一个类实现了Comparable接口,就意味着"该类支持排序". 而Comparator是比 ...

  5. java 比较器comparator_Java中比较器的使用Compare和Comparator

    Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较 ...

  6. Java 中 Comparable 和 Comparator 比较

    为什么80%的码农都做不了架构师?>>>    本文,先介绍Comparable 和Comparator两个接口,以及它们的差异:接着,通过示例,对它们的使用方法进行说明. Comp ...

  7. Java 解惑:Comparable 和 Comparator 的区别

    读完本文你将了解到: Comparable 自然排序 Comparator 定制排序 总结 Java 中为我们提供了两种比较机制:Comparable 和 Comparator,他们之间有什么区别呢? ...

  8. Comparable和Comparator使用区别

    2019独角兽企业重金招聘Python工程师标准>>> 前段时间用到了Comparable,是把json串转换为list后排序,后来又写了一个通用方法来调用,然后就用到了Compar ...

  9. Java中比较对象的两个接口Comparable接口和Comparator接口

    2019独角兽企业重金招聘Python工程师标准>>> jdk文档是这样介绍的 1.  public interface  Comparable<T>:此接口强行对实现它 ...

最新文章

  1. linux shell 产生随机数
  2. Select 标签可输入
  3. 学术写作利器——LaTeX入门笔记整理(不定期更新,附加使用心得)
  4. java从数组查找指定整数_如何在Java中使用重复项查找整数数组中的K个缺失数字?...
  5. 纯java应用搭建,16、BoneCp纯java项目使用
  6. Windows平台RTMP|RTSP播放器实现画面全屏功能
  7. ORACLE START WITH 语句的树级结构例子
  8. android的颜色渐变动画效果图,Android简单实现一个颜色渐变的ProgressBar
  9. mysql存储过程的一个小例子
  10. openfire源码解读--用户登录
  11. 全球编程厉害的14位大佬
  12. 关于跨团队合作的一些思考
  13. V4L2视频采集的基本流程
  14. 常用的表情和含义 各种笑脸;-)
  15. webstrom怎么配置git并提交
  16. Python实现学生成绩管理系统
  17. classnames库的简单使用
  18. 联想服务器RD450杨找不到raid选项,ThinkServer RD450服务器做RAID1
  19. 免格式化转换U盘格式
  20. Linux下安装mysql8.0.30

热门文章

  1. 程序中美元符号$是什么
  2. 用Git在阿里云下克隆时出现“Please make sure you have the correct access rights and the repository exists”错误
  3. HDP 2.6.5配置yarn的CGroups
  4. android 音量调节
  5. app开屏广告实现——借助webview和原生fetch请求实现
  6. C# 自定义控件,日期时间选择输入插件
  7. 天天向上的力量---python持续的力量
  8. 【Pyton安装】Python入门最详细的环境安装(附步骤),按照步骤点,几分钟就可以完成哦~
  9. Mac MySql官方下载速度太慢解决方案
  10. Xcode9中,添加图片素材无法显示的问题