java排序器_Java排序器之升序or降序

本文介绍了一种使用Java实现对象排序的方法,通过自定义排序规则,实现了先按年龄升序或降序排列,若年龄相同则按姓名首字母排序。演示了如何通过实现Comparable接口和Comparator接口来定制Person对象的排序逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

o1 = o2,返回0,按当前顺序即可,或者比较其他参数。

二、实际用例

Person 是定义的需要排序的对象,包括年龄和姓名两个字段。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

class Person implementsComparable{privateString name;private intage;//重写toString()方法,输出对象时输出格式为:name:age

@OverridepublicString toString() {return name+ ":" +age;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}public Person(String name, intage) {super();this.name =name;this.age =age;

}//Person自带的排序规则

@Overridepublic intcompareTo(Object o) {

Person p=(Person) o;//根据年龄进行排序

int temp = this.age -p.age;return temp == 0 ? this.name.compareTo(p.name):temp;

}

}

View Code

排序规则一:定义升序排序器,先按年龄升序,再按姓名首字母升序。

比如 o1对象为 (zhangshan:20) ,o2 对象为 (wangwu:21) ,默认排序 [o1, o2],由于 o1.age < o2.age,比较结果返回负数,false,表示不需要调整规则,按年龄升序排序,最终排序结果为 [zhangshan:20, wangwu:21]。

比如 o1 对象为 (zhangshan:20) ,o2对象为 (lisi:20),默认排序 [o1,o2],由于 o1.age = o2.age,比较结果为0,不按年龄排序,进一步比较name,由于 o1.name > o2.name,返回 true,调整排序规则,即按字母升序排序,最终排序结果为 [lisi:20, zhangshan:20]。

/**

* 自定义升序排序器

* 升序:先按年龄升序,再按姓名首字母升序

*/

class ComparatorByAge implementsComparator {

// 根据年龄排序

@Override

public intcompare(Object o1, Object o2) {

Person p1 =(Person) o1;

Person p2 =(Person) o2;

int tmp = p1.getAge() -p2.getAge();

return tmp == 0 ?p1.getName().compareTo(p2.getName()) : tmp;

}

}

排序规则二:定义降序排序器,先按年龄降序,再按姓名首字母降序。和升序的唯一区别就是返回结果的参数前添加了一个负号。

/**

* 自定义降序排序器

* 降序:先按年龄降序,再按姓名首字母降序

*/

class ComparatorByAge2 implementsComparator {

// 根据年龄排序

@Override

public intcompare(Object o1, Object o2) {

Person p1 =(Person) o1;

Person p2 =(Person) o2;

int tmp = p1.getAge() -p2.getAge();

return tmp == 0 ? -(p1.getName().compareTo(p2.getName())) : -tmp;

}

}

排序 main() 方法,查看两种排序器的排序结果。

public class TreeSetDemo {

public static void main(String[] args) {

TreeSet ts = new TreeSet(new ComparatorByAge());

ts.add(new Person("zhangsan", 20));

ts.add(new Person("wangwu", 21));

ts.add(new Person("lisi", 20));

ts.add(new Person("zhouqi", 29));

ts.add(new Person("zhaoliu", 28));

for (Person person : ts) {

System.out.println(person);

}

/* 结果输出

lisi:20

zhangsan:20

wangwu:21

zhaoliu:28

zhouqi:29

*/

ts = new TreeSet(new ComparatorByAge2());

ts.add(new Person("zhangsan", 20));

ts.add(new Person("wangwu", 21));

ts.add(new Person("lisi", 20));

ts.add(new Person("zhouqi", 29));

ts.add(new Person("zhaoliu", 28));

for (Person person : ts) {

System.out.println(person);

}

/* 结果输出

zhouqi:29

zhaoliu:28

wangwu:21

zhangsan:20

lisi:20

*/

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值