千家信息网

java自定义和自然排序的示例分析

发表于:2025-11-12 作者:千家信息网编辑
千家信息网最后更新 2025年11月12日,这篇文章主要为大家展示了"java自定义和自然排序的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java自定义和自然排序的示例分析"这篇文章吧。
千家信息网最后更新 2025年11月12日java自定义和自然排序的示例分析

这篇文章主要为大家展示了"java自定义和自然排序的示例分析",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"java自定义和自然排序的示例分析"这篇文章吧。

java集合的工具类Collections中提供了两种排序的方法,分别是:

Collections.sort(List list) Collections.sort(List list,Comparator c)

第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下:

实体类:(基本属性,getter/setter方法,有参无参构造方法,toString方法)

package test;public class Emp implements Comparable { 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; } public Emp() { super(); } public Emp(String name, int age) { super(); this.name = name; this.age = age; } @Override public String toString() { return "Emp [name=" + name + ", age=" + age + "]"; } @Override public int compareTo(Object o) { if(o instanceof Emp){ Emp emp = (Emp) o;// return this.age-emp.getAge();//按照年龄升序排序 return this.name.compareTo(emp.getName());//换姓名升序排序 } throw new ClassCastException("不能转换为Emp类型的对象..."); }}

第二种叫定制排序,或自定义排序,需编写匿名内部类,先new一个Comparator接口的比较器对象c,同时实现compare()其方法;

然后将比较器对象c传给Collections.sort()方法的参数列表中,实现排序功能;

说明:第一种方法不够灵活,实体类实现了comparable接口后,会增加耦合,如果在项目中不同的位置需要根据不同的属性调用排序方法时,需要反复修改比较规则(按name还是按age),二者只能选择其一,会起冲突.第二种就很好地解决了这个问题.在需要的地方,创建个内部类的实例,重写其比较方法即可.

jUnit4单元测试类代码如下:

package test;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;import org.junit.BeforeClass;import org.junit.Test;public class TestSort { static List list = new ArrayList(); //@BeforeClass注解标注的方法会在其它测试方法执行之前先执行, //且只执行一次.@Before注解标注的方法会在每个测试方法之前执行; //此处初始化集合只需要一次,因此使用@BeforeClass. @BeforeClass public static void init(){ list.add(new Emp("tom",18)); list.add(new Emp("jack",20)); list.add(new Emp("rose",15)); list.add(new Emp("jerry",17)); System.out.println("排序前:"); for(Object o : list){ System.out.println(o); } } /**按age升序排序*/// @Test// public void testSortAge(){// Collections.sort(list);// System.out.println("自然排序按age排序后:");// for(Object o : list){// System.out.println(o);// }// }// /**按name升序排序*/ @Test public void testSortName(){ Collections.sort(list); System.out.println("自然排序按name升序排序后:"); for(Object o : list){ System.out.println(o); } } /**使用Comparator比较器按age升序排序*/ @Test public void testComparatorSortAge(){ Collections.sort(list,new Comparator () { @Override public int compare(Object o1, Object o2) { if(o1 instanceof Emp && o2 instanceof Emp){ Emp e1 = (Emp) o1; Emp e2 = (Emp) o2; return e1.getAge() - e2.getAge(); } throw new ClassCastException("不能转换为Emp类型"); } }); System.out.println("使用Comparator比较器按age升序排序后:"); for(Object o : list){ System.out.println(o); } } /**使用Comparator比较器按name升序排序*/ @Test public void testComparatorSortName(){ Collections.sort(list,new Comparator () { @Override public int compare(Object o1, Object o2) { if(o1 instanceof Emp && o2 instanceof Emp){ Emp e1 = (Emp) o1; Emp e2 = (Emp) o2; return e1.getName().compareTo(e2.getName()); } throw new ClassCastException("不能转换为Emp类型"); } }); System.out.println("使用Comparator比较器按name升序排序后:"); for(Object o : list){ System.out.println(o); } }}

右键空白位置 -> Run As -> JUnit Test ->

运行结果如下:

排序前:Emp [name=tom, age=18]Emp [name=jack, age=20]Emp [name=rose, age=15]Emp [name=jerry, age=17]自然排序按name升序排序后:Emp [name=jack, age=20]Emp [name=jerry, age=17]Emp [name=rose, age=15]Emp [name=tom, age=18]使用Comparator比较器按age升序排序后:Emp [name=rose, age=15]Emp [name=jerry, age=17]Emp [name=tom, age=18]Emp [name=jack, age=20]使用Comparator比较器按name升序排序后:Emp [name=jack, age=20]Emp [name=jerry, age=17]Emp [name=rose, age=15]Emp [name=tom, age=18]

以上是"java自定义和自然排序的示例分析"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

排序 方法 升序 比较器 自然 对象 示例 义和 自定 分析 内容 接口 篇文章 类型 测试 不同 位置 实体 属性 注解 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何查看数据库的告警日志 我的世界服务器假设 群晖v2ray服务器教程 长沙crm软件开发团队 软件开发费用国标 数据库分表的具体操作过程 c 程序如何配置数据库连接 数据库技术及应用章节测试 数据库第四版第八章答案 互联网企业科技项目申报 保险公司软件开发跳槽好跳吗 是否要建立数据库 修改应用数据库后应用要重启吗 网络安全网络安全背景图片 逃离塔科夫西藏选哪个服务器 全球网络安全竞争报告 宁波app软件开发总结 百度的服务器后台是否安全 北京软件开发联系汇维创科技 vb软件开发工程师招聘 商丘信通网络技术有限公司 软件开发分析师是什么 重视网络安全作文800字 网络安全与信息化的制度 sql如何创建用户数据库 互联网企业科技项目申报 全球网络安全中的ai app图片如何保存数据库 服务器tps一般多少正常 数据库三级嵌套查询怎么写
0