JAVASE的内、外部比较器Comparable和Comparator

1.内部比较器,自定义实体类实现Comparable接口

/**
 * @author Nyotengu
 * @date 18/7/26 15:39
 */
public class SortTest {

    /**
     * 1.内部比较器
     *  适用于自定义的实体类
     */
    @Test
    public void sortWithOuterComparator() {
        ArrayList<PersonNoComparator> list = new ArrayList<>();

        list.add(new PersonNoComparator("Nyotengu", 1000));
        list.add(new PersonNoComparator("Honoka", 16));
        list.add(new PersonNoComparator("MarieRose", 16));
        list.add(new PersonNoComparator("Momiji", 20));
        list.add(new PersonNoComparator("Kasumi", 20));
        list.add(new PersonNoComparator("Helena", 25));

        // ArrayList中有sort方法,如果使用的集合没有sort方法,直接使用Collections工具类的sort方法,如:
        //      Collections.sort(list, new MyComparator());
        list.sort(new MyComparator());

        for (PersonNoComparator person : list) {
            System.out.println(person);
        }
        /* 结果如下:
         * PersonNoComparator{name='Honoka', age=16}
         * PersonNoComparator{name='MarieRose', age=16}
         * PersonNoComparator{name='Kasumi', age=20}
         * PersonNoComparator{name='Momiji', age=20}
         * PersonNoComparator{name='Helena', age=25}
         * PersonNoComparator{name='Nyotengu', age=1000}
         */

    }
}




public class PersonImplementsComparable implements Comparable<PersonImplementsComparable> {

    private String name;
    private int age;

    /**
     * compareTo 方法使用二叉树排序方法,
     * 例如:中序遍历,首先遍历左(右)子树,再访问根,最后遍历右(左)子树:
     * 返回值 > 0,排在后面
     * 返回值 < 0,排在前面
     * 返回值 = 0,舍弃该数值
     *
     * 例如(6,3,6,8,2,9)排序后为:
     *               6(root)
     *             3   8
     *(left)    2       9  (right)
     * @param o
     * @return int
     */
    @Override
    public int compareTo(PersonImplementsComparable o) {
        int result = this.age - o.age;

        if (result == 0)
            // 如果年龄相同,按照姓名从小到大排序
            return this.name.compareToIgnoreCase(o.name);

        // 按照年龄从小到大排序
        return result;
    }

    public PersonImplementsComparable(String name, int age) {

        this.name = name;
        this.age = age;
    }

    public PersonImplementsComparable() {
    }

    @Override
    public String toString() {
        return "PersonWithComparator{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}






2.外部比较器,自定义比较器类实现Comparator接口

public class SortTest {

    /**
     * 2.内部比较器
     * 适用于自定义的实体类
     */
    @Test
    public void sortWirthInnerComparator() {
        // treeset集合会自动排序
        TreeSet<PersonImplementsComparable> set = new TreeSet<PersonImplementsComparable>();

        set.add(new PersonImplementsComparable("Nyotengu", 1000));
        set.add(new PersonImplementsComparable("Honoka", 16));
        set.add(new PersonImplementsComparable("MarieRose", 16));
        set.add(new PersonImplementsComparable("Momiji", 20));
        set.add(new PersonImplementsComparable("Kasumi", 20));
        set.add(new PersonImplementsComparable("Helena", 25));

        for (PersonImplementsComparable person : set) {
            System.out.println(person);
        }
        /* 输出结果如下:
         * PersonWithComparator{name='Honoka', age=16}
         * PersonWithComparator{name='MarieRose', age=16}
         * PersonWithComparator{name='Kasumi', age=20}
         * PersonWithComparator{name='Momiji', age=20}
         * PersonWithComparator{name='Helena', age=25}
         * PersonWithComparator{name='Nyotengu', age=1000}
         */
    }
}



public class MyComparator implements Comparator<PersonNoComparator> {

    @Override
    public int compare(PersonNoComparator o1, PersonNoComparator o2) {
        int result = o1.getAge() - o2.getAge();

        if (result == 0)
            // 如果年龄相同,按姓名从小到大排序 使用String类的compare to方法
            return o1.getName().compareToIgnoreCase(o2.getName());
        // 按年龄从小到大排序
        return result;
    }
}




public class Person {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "PersonNoComparator{" + "name='" + name + '\'' + ", age=" + age + '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(String name, int age) {

        this.name = name;
        this.age = age;
    }

    public Person() {
    }
}

猜你喜欢

转载自blog.csdn.net/nyotengu/article/details/81222488