有时候我们会对集合中的对象进行排序,而且这个排序是根据自身系统的业务来排序的。这个时候需要自己重写排序的具体业务。在java中 我们可以实现Comparator接口,重写该接口的comapre方法即可
这里有一个需求:
在一个集合中对狗的年龄按从小到大排序输出
- 新建一个Dog类,定义属性
public class Dog {
private String name;
private int age;
private String type;
public Dog(String name, int age, String type) {
this.name = name;
this.age = age;
this.type = type;
}
public Dog() {
}
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 String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "Dog{" +
"name='" + name + '\'' +
", age=" + age +
", type='" + type + '\'' +
'}';
}
}
- 继承接口
public class Dog implements Comparable<Dog> {
这里来说一下Comparable接口,打开JDK API 我们可以看到
通过该接口中的compareTo(T o)方法可以对对象进行比较,而比较的依据就是对象里面的一些属性
- 重写方法
这里说一下重写的 public int compareTo(Dog o){} 这个方法,它返回三种 int 类型的值: 负整数,零 ,正整数。通过三种类型的返回值进行判断排序
返回值 | 含义 |
---|---|
负整数 | 当前对象的值 < 比较对象的值 , 位置排在前 |
零 | 当前对象的值 = 比较对象的值 , 位置不变 |
正整数 | 当前对象的值 > 比较对象的值 , 位置排在后 |
/**
* 排序规则:按照年龄进行排序,相同时按名称排序
* @param dog
* @return
*/
@Override
public int compareTo(Dog dog) {
int age = this.age;
int compareAge = dog.age;
if (age != compareAge) {
// 如果当前年龄小于比较年龄,放前面
// 如果当前年龄大于比较年龄,放后面
return age - compareAge;
} else {
// 如果年龄相等,按姓名排序
return this.name.compareTo(dog.name);
}
}
- 新建SortTest类
public class SortTest {
public static void main(String[] args) {
ArrayList<Dog> arrayList = new ArrayList<>();
arrayList.add(new Dog("金毛", 3, "寻回猎犬"));
arrayList.add(new Dog("二哈", 2, "哈士奇"));
arrayList.add(new Dog("旺柴", 4, "柴犬"));
arrayList.add(new Dog("土狗", 1, "中华田园犬"));
System.out.println("排序前:");
for (Dog dog: arrayList) {
System.out.println(dog);
}
// 排序
Collections.sort(arrayList);
System.out.println("排序后:");
for (Dog dog: arrayList) {
System.out.println(dog);
}
}
}
- 运行结果
排序完成!