前言:
在前面 Collections 工具类的具体实现方法中,有一个 sort () 的排序的方法,那个时候我们集合中的元素都是 String 和 一些基本数据类型,如果我们在集合中插入对象呢?such as – Person,Studnet 等自定义的对象,当我们插入这些的时候是会报错的。如下图:
因为我们的程序不知道根据对象的哪一个属性进行排序,这时候就需要我们自己实现。
方法一: 内部比较器 – ComParable
Student.java – 在该类内部实现比较
package collection;
// 内部比较器
// 实现 Comparable 重写方法
public class Student implements Comparable{
private int id;
private String name;
private int age;
public Student() {
}
public Student(int id, String name, int age) {
this.id = id;
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;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Override
public String toString() {
return "Student{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Object o) {
// 进去强制转换
Student inputStudent = (Student) o;
// 根据返回值作比较 -- 如果 id 相等 根据 姓名进行排序
// this 表示当前对象,另一个为传过来的对象
int result = this.id > inputStudent.id ? 1 : (this.id == inputStudent.id ? 0 : -1);
if (result == 0) {
// 调用 String 已经重写过的 compareTo() 方法
result = this.name.compareTo(inputStudent.name);
}
return result;
}
}
Test.java
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test05 {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();
// 添加 Student 对象
list.add(new Student(12,"zs",18));
list.add(new Student(6,"ls",12));
list.add(new Student(90,"ww",11));
System.out.println("未排序前" + list);
// 进行排序
Collections.sort(list);
System.out.println("排序后:" + list);
}
}
效果图:
方法二: 外部实现器 – Comparator
通过新建一个类用于专门实现其比较: 无侵入性,不会对原代码有影响(比较推荐)
Person.java – 向集合中添加的 对象
package collection;
public class Person {
private int id;
private String name;
private int age;
public Person() {
}
public Person(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 int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
MyComparatorWithId.java – 进行比较
package collection;
import java.util.Comparator;
public class MyComparatorWithId implements Comparator {
@Override
public int compare(Object o1, Object o2) {
// 传入两个对象进行比较 -- 与 C或C++中结构体比较类似
Person p1 = (Person) o1;
Person p2 = (Person) o2;
// 根据返回值进行比较
return p1.getId() - p2.getId();
}
}
Test.java
package collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Test06 {
// 外部比较器,无侵入性,对原代码无影响
public static void main(String[] args) {
List<Person> list = new ArrayList<>();
list.add(new Person(23,"ls",45));
list.add(new Person(27,"ww",65));
list.add(new Person(3,"zs",12));
System.out.println("未排序前" + list);
// 第二个参数是一个对象
Collections.sort(list,new MyComparatorWithId());
System.out.println("排序后:" + list);
}
}
效果图:
后记:
如果有解释的不到位的地方或者有疑问的地方,欢迎在下面留言提出,大家共同进步,
加油!!!