zoukankan      html  css  js  c++  java
  • Comparable与Comparator的区别


         Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。

     一、Comparator  强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。

    接口方法:

    1  int compare(T o1, T o2);

    案例实现:

     1 import java.util.Comparator;
     2 import java.util.HashMap;
     3 
     4 public class Pair implements Comparator<String> {
     5     
     6     HashMap<String, Integer> base_map;
     7 
     8     public Pair(HashMap<String, Integer> base_map) {
     9         this.base_map = base_map;
    10     }
    11     @Override
    12     public int compare(String arg0, String arg1) {
    13          if (!base_map.containsKey(arg0) || !base_map.containsKey(arg1)) {
    14              return 0;
    15          }
    16          if (base_map.get(arg0) < base_map.get(arg1)) {
    17              return 1;
    18          } else if (base_map.get(arg0) == base_map.get(arg1)) {
    19              return 0;
    20          } else {
    21              return -1;
    22          }
    23     }
    24 
    25 
    26 }

    二、Comparable 
    强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。 
    接口方法:

    1  public int compareTo(T o);

    案例代码比较年龄:

     1 class TestAge implements Comparable<Object>{
     2 
     3         private int age;
     4         
     5         public TestAge(int age){
     6             this.age=age;
     7         }
     8         @Override
     9         public int compareTo(Object o) {
    10              return this.age -((TestAge)o).age ;
    11         }
    12         
    13     }

    三、Comparator和Comparable的区别

    一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。 
    Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用: 
    1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身 
    2、可以使用多种排序标准,比如升序、降序等

     

  • 相关阅读:
    安装的时候,突然安装程序关闭,的灵异问题。
    CSAPP阅读笔记(1)-序
    CSAPP阅读笔记(2)-虚存管理
    nafxcwd.lib(afxmem.obj) :error LNK2005:"void * __cdecl operator new(unsigned int)"
    Linux内核源代码情景分析读书笔记(5)-关于fork/clone/vfork
    [转]调试经验总结VC下的错误对话框
    IP数据包首部的校验和算法
    Matlab画图及生成exe文件
    VC++6.0中的new
    Linux内核模块编译、加载&卸载及查看运行结果
  • 原文地址:https://www.cnblogs.com/houziwty/p/5104845.html
Copyright © 2011-2022 走看看