当前位置 : 主页 > 编程语言 > 其它开发 >

java中Comparable和Comparator

来源:互联网 收集:自由互联 发布时间:2022-05-30
目录 1.Comparable 2.Comparator 3.Comparable和Comparator的区别 Comparable 1. Comparable是java.lang包中的一个排序接口。 2. 只要一个类实现了这个接口就可以意味着这个类支持排序。 3.实现了这个类的接
目录 1.Comparable 2.Comparator 3.Comparable和Comparator的区别

 

Comparable

1. Comparable是java.lang包中的一个排序接口。

2. 只要一个类实现了这个接口就可以意味着这个类支持排序。

3.实现了这个类的接口的列表或者数组可以可以使用Collections.sort或Arrays.sort进行排序。

4.该接口的定义:

1 public interface Comparable<T> 
2 {
3     public int compareTo(T o);
4 }

T表示可以与这个对象进行比较的那些对象的类型。

这个方法只有一个coompareTo接口。实现这个接口的类必须要重写这个方法。

比较的规则:

  • 如果该对象和指定比较的对象相等,那么返回0。
  • 如果该对象比指定比较的对象大,那么返回正数。
  • 如果该对象比指定比较的对象小,返回负数。

实例:

实现Comparable的类:

class Person implements Comparable<Person>{
    String name;
    int age;

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

    /**
     * 重新的compareTo方法。
     * @param person 用于指定的比较的对象。
     * @returns 如果当前对象的年龄和指定对象的年龄相等则返回0,如果当前对象的年龄大于指定对象
     * 的年龄则返回正数。如果当前对象的年龄比指定对象的年龄小,则返回负数。
     */
    @Override
    public int compareTo(Person person) {
        return this.age - person.age;
    }
}

note:这里为了演示,没有进行封装。

进行比较演示:

import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        // 创建一个Person数组。
        Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};

        // 排序之前
        System.out.print("排序之前:");
        for (Person p : persons) {
            System.out.print("name:" + p.name + ", age:" + p.age + " ");
        }
        
        // 排序之后
        Arrays.sort(persons);
        System.out.println("排序之后:");
        for (Person p : persons) {
            System.out.print("name:" + p.name + ", age:" + p.age + " ");
        }

    }
}

结果:

 

 

 

Comparator

1.Comparator是java.util中的一个比较的接口。

2. 如果我们想要控制某个类的次序,而这个类并没有继承Comparable接口,那么我们就可以使用Comparator接口。

3. 比较的规则:大致和上面的规则相同,不过也有不同的地方,详情请看下面的代码。

4.源代码:

package java.util;
public interface Comparator<T>
 {
    int compare(T o1, T o2);
    boolean equals(Object obj);
 }
使用步骤
  1. 首先创意一个类实现Comparatro接口。note:这个类为你要比较的类的比较类。eg:如果你要想要比较Person对象,那么不要让Person实现这个接口,而是创建一个新的类叫做:PersonComparator,使用这个类实现Comparator。
  2. 比较时,传递比较器即可。

实例:

要比较的类
class Person {
    String name;
    int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
该类的比较类
class PersonComparator implements Comparator<Person> {
    /**
     * 用来比较两个对象的年龄。
     * @param p1 用来比较的第一个对象。
     * @param p2 用力比较的第二个对象。
     * @return 如果两个对象相等,则返回零。如果第一个对象大于第二个对象,则返回正数。如果第二个对象大于第一个对象,则返回负数。
     */
    @Override
    public int compare(Person p1, Person p2) {
        return p1.age - p2.age;
    }
}

比较演示:

import java.util.Comparator;
import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        // 创建一个Person数组。
        Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};

        // 排序之前
        System.out.print("排序之前:");
        for (Person p : persons) {
            System.out.print("name:" + p.name + ", age:" + p.age + " ");
        }
        
        // 排序之后
        // 将比较器作为参数传入。
        Arrays.sort(persons, new PersonComparator());
        System.out.println("排序之后:");
        for (Person p : persons) {
            System.out.print("name:" + p.name + ", age:" + p.age + " ");
        }
    }
}

也可以使用匿名数组:

import java.util.Comparator;
import java.util.Arrays;
public class Test {
    public static void main(String[] args) {
        // 创建一个Person数组。
        Person[] persons = new Person[]{new Person("tom", 20), new Person("jack", 12)};

        // 排序之前
        System.out.print("排序之前:");
        for (Person p : persons) {
            System.out.print("name:" + p.name + ", age:" + p.age + " ");
        }
        
        // 排序之后
        // 将比较器作为参数传入。
        Arrays.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person p1, Person p2) {
                return p1.age - p2.age;
            }
        });
        System.out.println("排序之后:");
        for (Person p : persons) {
            System.out.print("name:" + p.name + ", age:" + p.age + " ");
        }

    }
}

效果:

 

 

Comparable和Comparator的区别:

1.两者不在一个包。Comparable在java.lang中,而Comparator在java.util包中。

2.实现Comparable的类通常是一个我们要经常使用的类。比如:java中的String类等等。需要修改源代码。而Comparator可以在不同修改源代码的情况下,来完成比较。从了保护了代码。

两个方法各有优劣。如果你的类需要经常使用比较的操作,那么可以考虑让这个了实现Comparable接口。如果你偶尔使用比较的操作,那么可以考虑使用Comparator。

 

注意:作者只是一个自学java的小白,如果文章有任何错误的地方,望各位编程大佬进行指正,谢谢。

 

网友评论