java比较器Comparable接口和Comaprator接口的比较

Comparable接口:让自定义的对象具有比较规则

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
 * Comparable接口:让自定义的对象具有比较规则
 *
 *
 */
public class ComparableDemo {
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<Student>();
        list.add(new Student("zhangsan", 18));
        list.add(new Student("zhangsan", 28));
        list.add(new Student("lisi", 20));
        list.add(new Student("wangwu", 20));
        list.add(new Student("xiaoming", 21));
        list.add(new Student("dahuang", 22));

        // 列表中的所有元素都必须实现 Comparable 接口
        Collections.sort(list, new Comparator<Student>() {
            @Override
            public int compare(Student o1, Student o2) {
                // o1和o2比较:升序
                // 以姓名为主进行升序,如果姓名相等再以年龄为主进行升序
                // return o1.getName().equals(o2.getName()) ? o1.getAge() -
                // o2.getAge()
                // : o1.getName().compareTo(o2.getName());

                // o2和o1比较:降序
                // 以年龄为主进行降序,如果年龄相等再以姓名为主进行降序
                return o2.getAge() == o1.getAge() ? o2.getName().compareTo(o1.getName()) :
                    o2.getAge() - o1.getAge();
            }
        });// 我使用Comparator让Student具有比较规则

        for (Student s : list) {
            System.out.println(s);
        }
    }
}
package cn.edu360;

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

    public Person() {
        super();
    }

    public Person(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    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 char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
    }

}

输出结果:

  

  Student [name=zhangsan, age=28]

  Student [name=dahuang, age=22]

  Student [name=xiaoming, age=21]
  Student [name=wangwu, age=20]
  Student [name=lisi, age=20]
  Student [name=zhangsan, age=18]

Comparator比较接口:
   覆盖元素对象已有的比较规则
  让没有比较规则的对象具有比较规则

  

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/*
 * Comparator比较接口:
 *         覆盖元素对象已有的比较规则
 *         让没有比较规则的对象具有比较规则
 *
 *
 */
public class ComparatorDemo {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(10);
        list.add(0);
        list.add(20);
        list.add(-19);
        list.add(19);
        list.add(100);
        System.out.println(list);// [10, 0, 20, -19, 19, 100]

        // 匿名内部类本质上一个继承了类或者实现接口的匿名子类对象
        Comparator c = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                // o1和o2比较:升序
                // return o1.compareTo(o2);
                // return o1-o2;//对于整数类型的值来说,使用compareTo方法和直接用减法的效果是一样的

                // o2和o1比较:降序
                // return o2.compareTo(o1);
                return o2 - o1;// 对于整数类型的值来说,使用compareTo方法和直接用减法的效果是一样的
            }
        };

        // public static <T> void sort(List<T> list, Comparator<? super T> c)
        // 根据指定比较器产生的顺序对指定列表进行排序
        Collections.sort(list, c);

        System.out.println(list);// [100, 20, 19, 10, 0, -19]

        int location = Collections.binarySearch(list, 0, c);// 想对集合进行降序二分查找的时候,需要用到比较器
        System.out.println(location);
    }
}

输出结果:

  

[10, 0, 20, -19, 19, 100]
[100, 20, 19, 10, 0, -19]
4

总结:

Comparable与Comparator的区别

Comparable和Comparator都是用来实现集合中元素的比较、排序的。
Comparable是在集合内部定义的方法实现的排序,位于java.util下。
Comparator是在集合外部实现的排序,位于java.lang下。

Comparable是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己就实现了Comparable接口,可完成比较大小操作。自定义类要在加入list容器中后能够排序,也可以实现Comparable接口,在用Collections类的sort方法排序时若不指定Comparator,那就以自然顺序排序。所谓自然顺序就是实现Comparable接口设定的排序方式。

Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足要求时,可写一个比较器来完成两个对象之间大小的比较。Comparator体现了一种策略模式(strategy design pattern),就是不改变对象自身,而用一个策略对象(strategy object)来改变它的行为。

总而言之Comparable是自已完成比较,Comparator是外部程序实现比较。

原文地址:https://www.cnblogs.com/ll1994/p/8280529.html

时间: 2024-08-28 06:10:56

java比较器Comparable接口和Comaprator接口的比较的相关文章

java比较器Comparable接口和Comaprator接口

java的比较器有两类,分别是Comparable接口和Comparator接口. 在为对象数组进行排序时,比较器的作用非常明显,首先来讲解Comparable接口. 让需要进行排序的对象实现Comparable接口,重写其中的compareTo(T o)方法,在其中定义排序规则,那么就可以直接调用java.util.Arrays.sort()来排序对象数组,实例如下: class Student implements Comparable<Student>{ private String n

java lang(Comparable接口) 和java util(Comparator接口)分析比较

//Comparable 接口强行对实现它的每个类的对象进行整体排序. -- 自然排序.类的compareTo称为自然比较方法. public interface Comparable<T> { public int compareTo(T o); } 此接口强行对实现它的每个类的对象进行整体排序.这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法. 实现此接口的对象列表(和数组)可以通过 Collections.sort(和 Arrays.sort)进行自动排序

java中的排序Comparable接口和Comparator接口

普通的类要实现排序,必须实现Comparable接口,并重写CompareTo()方法. package test; public class Field implements Comparable<Field> {     private String name;     private int age;     public Field() {     }     public Field(String name, int age) {         this.name = name;

Java中Comparable和Comparator接口区别分析

Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧.Comparable 简介Comparable 是排序接口.若一个类实现了Comparab 本文要来详细分析一下Java中Comparable和Comparator接口的区别,

Java—集合框架 Collections.sort()、Comparable接口和Comparator接口

Collentions工具类--java.util.Collections Collentions是Java集合框架中,用来操作集合对象的工具类,也是Java集合框架的成员,与List.Map和Set是并列的. Collections.sort() 排序方法,实现对List对象中的元素进行排序. package com.test.collection; import java.util.ArrayList; import java.util.Collections; import java.ut

Java集合框架上机练习题:编写一个Book类,该类至少有name和price两个属性。该类要实现Comparable接口,在接口的compareTo()方法.....

编写一个Book类,该类至少有name和price两个属性.该类要实现Comparable接口,在接口的compareTo()方法中规定两个Book类实例的大小关系为二者的price属性的大小关系.在主函数中,选择合适的集合类型存放Book类的若干个对象,然后创建一个新的Book类的对象,并检查该对象与集合中的哪些对象相等. package javajihe; public class Book implements Comparable{ String name; float price; B

比较器:Compare接口与Comparator接口区别与理解

一.实现Compare接口与Comparator接口的类,都是为了对象实例数组排序的方便,因为可以直接调用 java.util.Arrays.sort(对象数组名称),可以自定义排序规则. 不同之处: 1 排序规则实现的方法不同 Comparable接口的方法:compareTo(Object o) Comparator接口的方法:compare(T o1, To2) 2 类设计前后不同 Comparable接口用于在类的设计中使用: Comparator接口用于类设计已经完成,还想排序(Arr

Comparable接口和Comparator接口

这两个接口经常容易混淆,不用的时候不清楚,用的时候就很容易出错,现摘抄网络上的一篇清楚的文章在此,便于日后查阅. 在实际应用中,我们往往有需要比较两个自定义对象大小的地方.而这些自定义对象的比较,就不像简单的整型数据那么简单,它们往往包含有许多的属性,我们一般都是根据这些属性对自定义对象进行比较的.所以Java中要比较对象的大小或者要对对象的集合进行排序,需要通过比较这些对象的某些属性的大小来确定它们之间的大小关系. 一般,Java中通过接口实现两个对象的比较,比较常用就是Comparable接

Java6.0中Comparable接口与Comparator接口详解

Java6.0中Comparable接口与Comparator接口详解 说到现在,读者应该对Comparable接口有了大概的了解,但是为什么又要有一个Comparator接口呢?难道Java的开发者都吃饱撑着没事做吗? 再谈Comparator接口之前,大家应该先了解一个叫“策略模式”的东东.一下是百度百科对策略模式的描写: 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化.(原文:The Strategy Pattern