java 实现Comparable接口排序,升序、降序、倒叙
本人由于项目开发中需要对查询结果list进行排序,这里根据的是每一个对象中的创建时间降序排序。本人讲解不深,只实现目的,如需理解原理还需查阅更深的资料。
1.实现的效果
2.创建排序的对象
packagecom.practice.test.comparable; importjava.util.Date; /** *描述:要比较的对象 * *@authorcui *@create2018-12-1814:07 */ publicclassMySortBeanimplementsComparable{ privateStringname; privateintage; privateDatecreateTime; publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicDategetCreateTime(){ returncreateTime; } publicvoidsetCreateTime(DatecreateTime){ this.createTime=createTime; } //@Override //publicintcompareTo(MySortBeano){ //if(this.age>o.age){ //return-1; //}elseif(this.age==o.age){ //return0; //} //return1; //} @Override publicintcompareTo(MySortBeano){ if(this.createTime.compareTo(o.getCreateTime())>0){ return-1; }elseif(this.createTime.compareTo(o.getCreateTime())==0){ return0; } return1; } @Override publicStringtoString(){ return"MySortBean{"+ "name='"+name+'\''+ ",age="+age+ '}'; } }
3.编写test方法
packagecom.practice.test; importcom.practice.test.comparable.MySortBean; importcom.spring.testlist.util.DateUtil; importorg.junit.Test; importorg.junit.runner.RunWith; importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner; importjava.util.ArrayList; importjava.util.Date; importjava.util.List; /** *描述: *测试比较器 * *@authorcui *@create2018-12-1814:10 */ @RunWith(SpringJUnit4ClassRunner.class) publicclassTestCompare{ @Test publicvoidtestComparable(){ MySortBeanm1=newMySortBean(); m1.setAge(1); m1.setCreateTime(DateUtil.parseDate("2019-01-2116:13:18")); MySortBeanm2=newMySortBean(); m2.setAge(2); m2.setCreateTime(DateUtil.parseDate("2019-01-2316:13:18")); MySortBeanm3=newMySortBean(); m3.setAge(3); m3.setCreateTime(DateUtil.parseDate("2019-01-2216:13:18")); MySortBeanm4=newMySortBean(); m4.setAge(4); m4.setCreateTime(DateUtil.parseDate("2019-01-2416:13:18")); MySortBeanm5=newMySortBean(); m5.setAge(5); m5.setCreateTime(DateUtil.parseDate("2019-01-2516:13:18")); Listl=newArrayList<>(5); l.add(m1); l.add(m2); l.add(m4); l.add(m5); l.add(m3); System.out.println("排序前:"); for(MySortBeani:l){ System.out.println(DateUtil.formatDate(i.getCreateTime(),"yyyy-MM-ddHH:mm:ss")); } /** *自定义排序 *直接return-1倒叙排列,list顺序颠倒输出 * *if(o1.getAge()>o2.getAge()){ *return1; *} *return-1; *以上升序输出 * *if(o1.getAge()>o2.getAge()){ *return-1; *} *return1; *以上降序输出 * * */ /*Comparator comparator=newComparator (){ @Override publicintcompare(MySortBeano1,MySortBeano2){ if(o1.getAge()>o2.getAge()){ return-1; } return1; } }; l.sort(comparator);*/ l.sort(MySortBean::compareTo); System.out.println("--------"); System.out.println("排序后:"); for(MySortBeani:l){ System.out.println(DateUtil.formatDate(i.getCreateTime(),"yyyy-MM-ddHH:mm:ss")); } } }
4.时间格式化工具类
packagecom.spring.testlist.util; importorg.apache.commons.lang3.time.DateFormatUtils; importjava.text.ParseException; importjava.text.SimpleDateFormat; importjava.util.Calendar; importjava.util.Date; /** *日期工具类,继承org.apache.commons.lang.time.DateUtils类 * *@authorcui *@create2018-10-2615:30 **/ publicclassDateUtilextendsorg.apache.commons.lang3.time.DateUtils{ privatestaticString[]parsePatterns={ "yyyy-MM-dd","yyyy-MM-ddHH:mm:ss","yyyy-MM-ddHH:mm","yyyy-MM", "yyyy/MM/dd","yyyy/MM/ddHH:mm:ss","yyyy/MM/ddHH:mm","yyyy/MM", "yyyy.MM.dd","yyyy.MM.ddHH:mm:ss","yyyy.MM.ddHH:mm","yyyy.MM"}; /** *得到当前日期字符串格式(yyyy-MM-dd) */ publicstaticStringgetDate(){ returngetDate("yyyy-MM-dd"); } /** *得到当前日期字符串格式(yyyyMMdd) */ publicstaticStringgetSizeDate(){ returngetDate("yyyyMMdd"); } /** *得到当前日期字符串格式(yyyy-MM-dd)pattern可以为:"yyyy-MM-dd""HH:mm:ss""E" */ publicstaticStringgetDate(Stringpattern){ returnDateFormatUtils.format(newDate(),pattern); } /** *得到日期字符串默认格式(yyyy-MM-dd)pattern可以为:"yyyy-MM-dd""HH:mm:ss""E" */ publicstaticStringformatDate(Datedate,Object...pattern){ if(date==null){ returnnull; } StringformatDate=null; if(pattern!=null&&pattern.length>0){ formatDate=DateFormatUtils.format(date,pattern[0].toString()); }else{ formatDate=DateFormatUtils.format(date,"yyyy-MM-dd"); } returnformatDate; } /** *得到日期时间字符串,转换格式(yyyy-MM-ddHH:mm:ss) */ publicstaticStringformatDateTime(Datedate){ returnformatDate(date,"yyyy-MM-ddHH:mm:ss"); } /** *得到当前时间字符串格式(HH:mm:ss) */ publicstaticStringgetTime(){ returnformatDate(newDate(),"HH:mm:ss"); } /** *得到当前日期和时间字符串格式(yyyy-MM-ddHH:mm:ss) */ publicstaticStringgetDateTime(){ returnformatDate(newDate(),"yyyy-MM-ddHH:mm:ss"); } /** *得到当前年份字符串格式(yyyy) */ publicstaticStringgetYear(){ returnformatDate(newDate(),"yyyy"); } /** *得到当前月份字符串格式(MM) */ publicstaticStringgetMonth(){ returnformatDate(newDate(),"MM"); } /** *得到当天字符串格式(dd) */ publicstaticStringgetDay(){ returnformatDate(newDate(),"dd"); } /** *得到当前星期字符串格式(E)星期几 */ publicstaticStringgetWeek(){ returnformatDate(newDate(),"E"); } /** *日期型字符串转化为日期格式 *{"yyyy-MM-dd","yyyy-MM-ddHH:mm:ss","yyyy-MM-ddHH:mm", *"yyyy/MM/dd","yyyy/MM/ddHH:mm:ss","yyyy/MM/ddHH:mm", *"yyyy.MM.dd","yyyy.MM.ddHH:mm:ss","yyyy.MM.ddHH:mm"} */ publicstaticDateparseDate(Objectstr){ if(str==null){ returnnull; } try{ returnparseDate(str.toString(),parsePatterns); }catch(ParseExceptione){ returnnull; } } /** *获取过去的天数 * *@paramdate *@return */ publicstaticlongpastDays(Datedate){ longt=System.currentTimeMillis()-date.getTime(); returnt/(24*60*60*1000); } /** *获取过去的小时 * *@paramdate *@return */ publicstaticlongpastHour(Datedate){ longt=System.currentTimeMillis()-date.getTime(); returnt/(60*60*1000); } /** *获取过去的分钟 * *@paramdate *@return */ publicstaticlongpastMinutes(Datedate){ longt=System.currentTimeMillis()-date.getTime(); returnt/(60*1000); } /** *转换为时间(天,时:分:秒.毫秒) * *@paramtimeMillis *@return */ publicstaticStringformatDateTime(longtimeMillis){ longday=timeMillis/(24*60*60*1000); longhour=(timeMillis/(60*60*1000)-day*24); longmin=((timeMillis/(60*1000))-day*24*60-hour*60); longs=(timeMillis/1000-day*24*60*60-hour*60*60-min*60); longsss=(timeMillis-day*24*60*60*1000-hour*60*60*1000-min*60*1000-s*1000); return(day>0?day+",":"")+hour+":"+min+":"+s+"."+sss; } /** *获取两个日期之间的天数 * *@parambefore *@paramafter *@return */ publicstaticdoublegetDistanceOfTwoDate(Datebefore,Dateafter){ longbeforeTime=before.getTime(); longafterTime=after.getTime(); return(afterTime-beforeTime)/(1000*60*60*24); } publicstaticStringgetFirstDayOfMonth(){ SimpleDateFormatformat=newSimpleDateFormat("yyyy-MM-dd"); //获取当前月第一天: Calendarc=Calendar.getInstance(); c.add(Calendar.MONTH,0); c.set(Calendar.DAY_OF_MONTH,1);//设置为1号,当前日期既为本月第一天 Stringfirst=format.format(c.getTime()); returnfirst; } /** *@paramargs *@throwsParseException */ publicstaticvoidmain(String[]args)throwsParseException{ //System.out.println(formatDate(parseDate("2010/3/6"))); //System.out.println(getDate("yyyy年MM月dd日E")); //longtime=newDate().getTime()-parseDate("2012-11-19").getTime(); //System.out.println(time/(24*60*60*1000)); StringsizeDate=formatDate(newDate(),"yyyyMMdd"); System.out.println(sizeDate); } }
到此就结束了,具体的要实现什么排序,根据示例自己脑补扩展就好了,例子中备注也已经标注。
在使用排序注意两个坑
1.要排序的字段为空的异常处理
2.要排序的字段相等的异常处理
补充知识:Java中的自然排序和比较器排序
写在前面的话:刚开始学习着两者排序时我也是一头雾水,虽然能写出来但是稀里糊涂,几时该用哪个排序一点想法都没有,后来经过研究这两者的作用点不同,自然排序作用在实体类上,而比较器排序作用在装实体类的集合上。
1、自然排序:java.lang.Comparable
Comparable接口中只提供了一个方法:compareTo(Objectobj),该方法的返回值是int。如果返回值为正数,则表示当前对象(调用该方法的对象)比obj对象“大”;反之“小”;如果为零的话,则表示两对象相等。
总结为一句话:实现Comparable,重写compareTo方法
案列:以TreeMap为例,默认的升序,可以重写自然排序的方法改变原有排序
publicstaticvoidtestComparable(){ TreeMaptmp=newTreeMap (); tmp.put(newCar(4),"肆"); tmp.put(newCar(1),"壹"); tmp.put(newCar(5),"伍"); tmp.put(newCar(3),"三"); tmp.put(newCar(2),"贰"); System.out.println(tmp); //结果://{Car[price=5.0]=伍,Car[price=4.0]=肆,Car[price=3.0]=三,Car[price=2.0]=贰,Car[price=1.0]=壹} } //自定义TreeMap排序方法自然排序 classCarimplementsComparable { privatedoubleprice; publicdoublegetPrice(){ returnprice; } publicvoidsetPrice(doubleprice){ this.price=price; } publicCar(intprice){ super(); this.price=price; } @Override publicintcompareTo(Caro){ //TODOAuto-generatedmethodstub if(this.price>o.getPrice()){ return-1;//大的往前排 }elseif(this.price 2、比较器排序:java.util.Comparator
总结为一句话:实现Comparator接口,重写compare方法
publicstaticvoidtestComparator(){ //HashMaphm=newHashMap (); TreeMap tmp=newTreeMap (newMyComparatorBigtoSmall()); tmp.put(4,"肆"); tmp.put(1,"壹"); tmp.put(5,"伍"); tmp.put(3,"三"); tmp.put(2,"贰"); //System.out.println(tmp);//默认排序结果:{1=壹,2=贰,3=三,4=肆,5=伍} System.out.println(tmp);//修改为比较器排序(升序){5=伍,4=肆,3=三,2=贰,1=壹} } //自定义TreeMap排序方法比较器排序 classMyComparatorBigtoSmallimplementsComparator { @Override publicintcompare(Integero1,Integero2){ //TODOAuto-generatedmethodstub returno2-o1; } } 以上这篇java实现Comparable接口排序,升序、降序、倒叙就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。