zoukankan      html  css  js  c++  java
  • comparator接口与Comparable接口的差别

    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 假设想排序, 也要实现一个比較器。

    1. 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() ).

    1. Comparator 和 Comparable 的实例

    Comparable:

    实现Comparable接口要覆盖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 里面用户能够自
    己实现复杂的能够通用的逻辑,使其能够匹配一些比較简单的对象,那样就能够节省非常多反复劳动了。

    应用自:http://www.cnblogs.com/sunflower627/p/3158042.html

  • 相关阅读:
    JavaWeb--HttpSession案例
    codeforces B. Balls Game 解题报告
    hdu 1711 Number Sequence 解题报告
    codeforces B. Online Meeting 解题报告
    ZOJ 3706 Break Standard Weight 解题报告
    codeforces C. Magic Formulas 解题报告
    codeforces B. Sereja and Mirroring 解题报告
    zoj 1109 Language of FatMouse 解题报告
    hdu 1361.Parencodings 解题报告
    hdu 1004 Let the Balloon Rise 解题报告
  • 原文地址:https://www.cnblogs.com/wgwyanfs/p/7308756.html
Copyright © 2011-2022 走看看