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;
}
}
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());
}
}
}
1 jon 25
2 tom 28
3 juan 26
4 david 25
--------------------
1 jon 25
4 david 25
3 juan 26
2 tom 28