一、Comparable接口
Comparable是一个排序接口
此接口给实现类提供了一个排序的方法,此接口有且只有一个方法(接口中没有声明public是因为接口方法默认为public,但调用该方法时必须声明public)
int compareTo(T o);
实例:通过id进行排序
public class UserInfo implements Comparable<UserInfo> {
private int id;
private String username;
private String phone;
private String otherInfo;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getOtherInfo() {
return otherInfo;
}
public void setOtherInfo(String otherInfo) {
this.otherInfo = otherInfo;
}
/**
* Comparable提供的唯一一种排序方法,此方法接受任意类型的参数来进行比较(泛型)
* @param userInfo
* @return
*/
@Override
public int compareTo(UserInfo userInfo) {
return id-userInfo.id;
}
@Override
public String toString() {
return "UserInfo{" +
"id=" + id +
", username='" + username + '\'' +
", phone='" + phone + '\'' +
", otherInfo='" + otherInfo + '\'' +
'}';
}
}
Main方法代码:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
UserInfo[] userInfo =new UserInfo[4];
userInfo[0]=new UserInfo();
userInfo[0].setId(10);
userInfo[0].setUsername("abc");
userInfo[1]=new UserInfo();
userInfo[1].setId(20);
userInfo[1].setUsername("lmn");
userInfo[2]=new UserInfo();
userInfo[2].setId(15);
userInfo[2].setUsername("def");
userInfo[3]=new UserInfo();
userInfo[3].setId(17);
userInfo[3].setUsername("opq");
Arrays.sort(userInfo);
// SortByUserName sortByUserName =new SortByUserName();
// Arrays.sort(userInfo,sortByUserName);
for(UserInfo i:userInfo){
System.out.println(i);
}
}
}
输出结果:按id从小到大排序
二、Comparator接口
Comparator相当于一个比较器接口
int compare(T o1, T o2);
实例:通过username进行排序
import java.util.Comparator;
public class SortByUserName implements Comparator<UserInfo> {
/**
* 重写了compare方法
* @param t1
* @param t2
* @return
*/
@Override
public int compare(UserInfo t1, UserInfo t2) {
return t1.getUsername().compareTo(t2.getUsername());
}
}
Main方法代码:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
UserInfo[] userInfo =new UserInfo[4];
userInfo[0]=new UserInfo();
userInfo[0].setId(10);
userInfo[0].setUsername("abc");
userInfo[1]=new UserInfo();
userInfo[1].setId(20);
userInfo[1].setUsername("lmn");
userInfo[2]=new UserInfo();
userInfo[2].setId(15);
userInfo[2].setUsername("def");
userInfo[3]=new UserInfo();
userInfo[3].setId(17);
userInfo[3].setUsername("opq");
//Arrays.sort(userInfo);
SortByUserName sortByUserName =new SortByUserName();
Arrays.sort(userInfo,sortByUserName);
for(UserInfo i:userInfo){
System.out.println(i);
}
}
}
输出结果:按字典顺序输出username
另外,Comparator比较器接口允许我们自定义比较方法,打破按字典顺序比较字符串的方式比较
实例:按长度递增顺序对username对应的字符串进行排序
import java.util.Comparator;
public class SortByUserName implements Comparator<UserInfo> {
/**
* 重写了compare方法
* @param t1
* @param t2
* @return
*/
@Override
public int compare(UserInfo t1, UserInfo t2) {
return t1.getUsername().length()-t2.getUsername().length();
}
}
Main方法代码:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
UserInfo[] userInfo =new UserInfo[4];
userInfo[0]=new UserInfo();
userInfo[0].setId(10);
userInfo[0].setUsername("000abc");
userInfo[1]=new UserInfo();
userInfo[1].setId(20);
userInfo[1].setUsername("0000lmn");
userInfo[2]=new UserInfo();
userInfo[2].setId(15);
userInfo[2].setUsername("00def");
userInfo[3]=new UserInfo();
userInfo[3].setId(17);
userInfo[3].setUsername("opq");
//Arrays.sort(userInfo);
SortByUserName sortByUserName =new SortByUserName();
//Arrays.sort(数组,比较器)
Arrays.sort(userInfo,sortByUserName);
for(UserInfo i:userInfo){
System.out.println(i);
}
}
}
输出结果:按username所对应的字符串长度递增排序
三、Comparable与Comparator比较
1.Comparable是接口需要被类继承的,相当于本身这个数组或者列表及类就有这 种比较方式
2.Comparator相当于给一个数组或列表新增一种比较方式