基本数据类型可以直接确定出数值的大小关系,引用数据类型要想确定大小关系就必须通过比较器来完成。
- Comparable比较器
- Comparator比较器
1、使用Comparable比较器实现自定义类对象数组排序的例子:
package com.mydemo;
import java.util.Arrays;
public class ComparableDemo {
public static void main(String[] args) {
Member memberA = new Member("张三", 18);
Member memberB = new Member("李四", 20);
Member memberC = new Member("王五", 22);
Member memberD = new Member("赵六", 24);
Member memberArray[] = new Member[]{
memberA,
memberD,
memberB,
memberC
};
System.out.println("排序前:");
for (int i = 0; i < memberArray.length; i++){
System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
}
System.out.println("======================");
// 对象数组排序
Arrays.sort(memberArray);
System.out.println("排序后:");
// System.out.println(Arrays.toString(memberArray));
for (int i = 0; i < memberArray.length; i++){
System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
}
}
}
// 自定义类对象实现比较器
class Member implements Comparable<Member> {
private String name; // 成员属性
private int 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;
}
/**
* 构造方法初始化
*
* @param name
* @param age
*/
public Member(String name, int age) {
this.name = name;
this.age = age;
}
/**
* 方法覆写
*
* @param o
* @return
*/
@Override
public int compareTo(Member o) {
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
} else {
return 0;
}
// 简化编写格式
// return this.age - o.age;
}
@Override
public String toString() {
return "【Member类对象】姓名:" + this.name + "、年龄:" + this.age + "\n";
}
}
运行结果:
排序前:
姓名:张三、年龄:18
姓名:赵六、年龄:24
姓名:李四、年龄:20
姓名:王五、年龄:22
======================
排序后:
姓名:张三、年龄:18
姓名:李四、年龄:20
姓名:王五、年龄:22
姓名:赵六、年龄:24
2、使用Comparator实现对象数组排序的例子:
package com.mydemo;
import java.util.Arrays;
import java.util.Comparator;
public class ComparableDemo {
public static void main(String[] args) {
Member memberArray[] = new Member[]{
new Member("张三", 18),
new Member("赵六", 21),
new Member("王五", 20),
new Member("李四", 19)
};
System.out.println("排序前:");
for (int i = 0; i < memberArray.length; i++){
System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
}
System.out.println("======================");
// 对象数组排序
Arrays.sort(memberArray, new MeberComparator());
System.out.println("排序后:");
for (int i = 0; i < memberArray.length; i++){
System.out.println("姓名:" +memberArray[i].getName() + "、年龄:" + memberArray[i].getAge());
}
}
}
class MeberComparator implements Comparator<Member> {
/**
* 覆写
*
* @param o1
* @param o2
* @return
*/
@Override
public int compare(Member o1, Member o2) {
return o1.getAge() - o2.getAge();
}
}
// 自定义类
class Member {
private String name;
private int age;
/**
* 构造方法初始化
*
* @param name
* @param age
*/
public Member(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Member{" +
"name='" + this.name + '\'' +
", age=" + this.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;
}
}
运行结果:
排序前:
姓名:张三、年龄:18
姓名:赵六、年龄:21
姓名:王五、年龄:20
姓名:李四、年龄:19
======================
排序后:
姓名:张三、年龄:18
姓名:李四、年龄:19
姓名:王五、年龄:20
姓名:赵六、年龄:21