zoukankan      html  css  js  c++  java
  • Java6.0中Comparable接口与Comparator接口详解

    说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者都吃饱撑着没事做吗?

    再谈Comparator接口之前,大家应该先了解一个叫“策略模式”的东东。一下是百度百科对策略模式的描写:

    策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。(原文:The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them interchangeable. Strategy lets the algorithm vary independently from clients that use it.)

    之所以要谈到策略模式,就是因为Comparator接口其实就是一种策略模式的实践。实现Comparator接口的类必然就会实现一个compareTo(Object o1, Object o2)的方法,而这个方法就是算法中的一部分,所有使用了compareTo方法的类都不会关心compareTo是如何工作的,只关心他的返回值,这也是面向对象中著名的封装特性。

    那Comparator接口应该如何使用呢?别急,首先我们要先对Person类进行一下处理,因为我们现在使用Comparator接口,所以Comparable接口就可以光荣的退休了:

       1: public class Person {
       2:  
       3:     private String name;
       4:     private int age;
       5:     
       6:     public Person() {
       7:         
       8:     }
       9:     
      10:     public Person(String name, int age) {
      11:         this.name = name;
      12:         this.age = age;
      13:     }
      14:  
      15:     public String getName() {
      16:         return name;
      17:     }
      18:  
      19:     public void setName(String name) {
      20:         this.name = name;
      21:     }
      22:  
      23:     public int getAge() {
      24:         return age;
      25:     }
      26:  
      27:     public void setAge(int age) {
      28:         this.age = age;
      29:     }
      30:  
      31:     @Override
      32:     public String toString() {
      33:         return "Person [age=" + age + ", name=" + name + "]";
      34:     }
      35:  
      36: }

    新建一个实现Comparator的实现类PersonComparator:

       1: import java.util.Comparator;
       2:  
       3: public class PersonComparator implements Comparator<Person> {
       4:  
       5:     @Override
       6:     public int compare(Person p1, Person p2) {
       7:         if (p1.getAge() > p2.getAge()) {
       8:             return 1;
       9:         } else if (p1.getAge() < p2.getAge()) {
      10:             return -1;
      11:         }
      12:         return 0;
      13:     }
      14:     
      15: }

    然后再用回我们的CompareTest做测试:

       1: import java.util.Arrays;
       2:  
       3: public class CompareTest {
       4:  
       5:     public static void main(String[] args) {
       6:         Person[] persons = {
       7:                 new Person("P1", 60),
       8:                 new Person("P2", 20),
       9:                 new Person("P3", 40)
      10:         };
      11:         
      12:         System.out.println(Arrays.toString(persons));
      13:         
      14:         Arrays.sort(persons, new PersonComparator());
      15:         
      16:         System.out.println(Arrays.toString(persons));
      17:     }
      18:  
      19: }

    注意:在上面的sort方法中,我们传进了一个PersonComparator的实例对象作为参数,读者也可以试试不传入这个参数,看是否能正确工作。

    结果当然是跟上面演示的例子一样啦,我就不再重复了

  • 相关阅读:
    idea git 操作
    1
    python 迭代器/生成器/迭代对象
    python 中的type
    systemd 配置文件
    python 中类的初始化过程
    mysql主从错误180301
    从零开始搭建k8s-20180301
    kubernetes role
    Java程序员毕业两年自述
  • 原文地址:https://www.cnblogs.com/senior-engineer/p/4876175.html
Copyright © 2011-2022 走看看