您的位置:首页 > 编程语言 > Java开发

java中Comparable 和 Comparator 区别及实例演示

2016-06-03 11:24 731 查看
java中有两种方式可以进行集合的排序:

1、集合中对象的所属类实现java.lang.Comparable 接口

2、集合指定比较器 java.lang.Comparator 的实现类

下面就Comparable 和Comparator 进行简单的介绍:

一、Comparable 接口

1、若一个类实现了Comparable接口,就意味着“该类支持排序”。  即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序,此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。

2、接口定义

package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}


eg: x.compareTo(y)  ,x<y 返回-1,x>y返回1,x=y 返回0

比较的数据类型:

1)、BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short----------按数字大小排序

2)、Character-----------按 Unicode 值的数字大小排序

3)、String----------------按字符串中字符 Unicode 值排序

3、代码展示

1)、Person.java,实现Comparable接口

package cn.java.compare;

public class Person implements Comparable<Person>{

private String name;
private int age;

public Person(String name, int age) {
this.name = name;
this.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;
}

@Override
public int compareTo(Person o) {

return this.name.compareTo(o.name);
}

}
2)、TestPerson.java测试类
package cn.java.compare;

import java.util.Arrays;

public class TestPerson {

public static void main(String[] args) {

Person[] data=new Person[]{new Person("jon", 21),new Person("daivd", 28),new Person("tom", 26),new Person("bob", 25)};
disPlay(data);
Arrays.sort(data);
System.out.println("----------------------");
disPlay(data);
}

public static void disPlay(Person[] data) {

for (int i = 0; i < data.length; i++) {
System.out.println(data[i].getName()+" "+data[i].getAge());
}
}

}
3)、输出结果前后对比
jon 21
daivd 28
tom 26
bob 25
----------------------
bob 25
daivd 28
jon 21
tom 26

二、 Comparator 接口

1、若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可

2、接口定义

package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
1)、若一个类要实现Comparator接口:它一定要实现compareTo(T o1, T o2) 函数,但可以不实现 equals(Object obj) 函数;

2)、int compare(T o1, T o2) 是“比较o1和o2的大小”,o1<o2 返回负数;o1>o2;返回正数,o1==o2返回零.

3、代码展示

1)、User.java

package cn.java.compare;

public class User {

private int id;
private String name;
private int age;

public User(int id, String name,int age) {
this.id = id;
this.name = name;
this.age=age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

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

public int getAge() {
return age;
}

}


2)、UserComparator.java 实现Comparator的接口
package cn.java.compare;

import java.util.Comparator;

public class UserComparator implements Comparator<User>{

@Override
public int compare(User user1, User user2) {
// if (user1.getAge()<user2.getAge()) {
// return -1;
// }else if(user1.getAge()>user2.getAge())
// {
// return 1;
// }else
//
// return 0;

return user1.getAge()-user2.getAge();
}

}


3)、TestComparator.java 测试类
package cn.java.compare;

import java.util.Arrays;

public class TestComparator {

public static void main(String[] args) {

User[] userArray=new User[]{new User(1, "jon", 25),new User(2, "tom", 28),new User(3, "juan", 26),new User(4, "david", 25)};
disPlay(userArray);
Arrays.sort(userArray, new UserComparator());
System.out.println("--------------------");
disPlay(userArray);
}

public static void disPlay(User[] data) {

for (int i = 0; i < data.length; i++) {
System.out.println(data[i].getId()+" "+data[i].getName()+" "+data[i].getAge());
}
}

}


4)、输出结果前后对比
1 jon 25
2 tom 28
3 juan 26
4 david 25
--------------------
1 jon 25
4 david 25
3 juan 26
2 tom 28
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: