简单了解java自定义和自然排序
java集合的工具类Collections中提供了两种排序的方法,分别是:
- Collections.sort(Listlist)
- Collections.sort(Listlist,Comparatorc)
第一种称为自然排序,参与排序的对象需实现comparable接口,重写其compareTo()方法,方法体中实现对象的比较大小规则,示例如下:
实体类:(基本属性,getter/setter方法,有参无参构造方法,toString方法)
packagetest;
publicclassEmpimplementsComparable{
privateStringname;
privateintage;
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetAge(){
returnage;
}
publicvoidsetAge(intage){
this.age=age;
}
publicEmp(){
super();
}
publicEmp(Stringname,intage){
super();
this.name=name;
this.age=age;
}
@Override
publicStringtoString(){
return"Emp[name="+name+",age="+age+"]";
}
@Override
publicintcompareTo(Objecto){
if(oinstanceofEmp){
Empemp=(Emp)o;
//returnthis.age-emp.getAge();//按照年龄升序排序
returnthis.name.compareTo(emp.getName());//换姓名升序排序
}
thrownewClassCastException("不能转换为Emp类型的对象...");
}
}
第二种叫定制排序,或自定义排序,需编写匿名内部类,先new一个Comparator接口的比较器对象c,同时实现compare()其方法;
然后将比较器对象c传给Collections.sort()方法的参数列表中,实现排序功能;
说明:第一种方法不够灵活,实体类实现了comparable接口后,会增加耦合,如果在项目中不同的位置需要根据不同的属性调用排序方法时,需要反复修改比较规则(按name还是按age),二者只能选择其一,会起冲突.第二种就很好地解决了这个问题.在需要的地方,创建个内部类的实例,重写其比较方法即可.
jUnit4单元测试类代码如下:
packagetest;
importjava.util.ArrayList;
importjava.util.Collections;
importjava.util.Comparator;
importjava.util.List;
importorg.junit.BeforeClass;
importorg.junit.Test;
publicclassTestSort{
staticListlist=newArrayList();
//@BeforeClass注解标注的方法会在其它测试方法执行之前先执行,
//且只执行一次.@Before注解标注的方法会在每个测试方法之前执行;
//此处初始化集合只需要一次,因此使用@BeforeClass.
@BeforeClass
publicstaticvoidinit(){
list.add(newEmp("tom",18));
list.add(newEmp("jack",20));
list.add(newEmp("rose",15));
list.add(newEmp("jerry",17));
System.out.println("排序前:");
for(Objecto:list){
System.out.println(o);
}
}
/**按age升序排序*/
//@Test
//publicvoidtestSortAge(){
//Collections.sort(list);
//System.out.println("自然排序按age排序后:");
//for(Objecto:list){
//System.out.println(o);
//}
//}
//
/**按name升序排序*/
@Test
publicvoidtestSortName(){
Collections.sort(list);
System.out.println("自然排序按name升序排序后:");
for(Objecto:list){
System.out.println(o);
}
}
/**使用Comparator比较器按age升序排序*/
@Test
publicvoidtestComparatorSortAge(){
Collections.sort(list,newComparator(){
@Override
publicintcompare(Objecto1,Objecto2){
if(o1instanceofEmp&&o2instanceofEmp){
Empe1=(Emp)o1;
Empe2=(Emp)o2;
returne1.getAge()-e2.getAge();
}
thrownewClassCastException("不能转换为Emp类型");
}
});
System.out.println("使用Comparator比较器按age升序排序后:");
for(Objecto:list){
System.out.println(o);
}
}
/**使用Comparator比较器按name升序排序*/
@Test
publicvoidtestComparatorSortName(){
Collections.sort(list,newComparator(){
@Override
publicintcompare(Objecto1,Objecto2){
if(o1instanceofEmp&&o2instanceofEmp){
Empe1=(Emp)o1;
Empe2=(Emp)o2;
returne1.getName().compareTo(e2.getName());
}
thrownewClassCastException("不能转换为Emp类型");
}
});
System.out.println("使用Comparator比较器按name升序排序后:");
for(Objecto:list){
System.out.println(o);
}
}
}
右键空白位置—>RunAs—>JUnitTest—>
运行结果如下:
排序前: 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]
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。