java map对象排序输出_java实现对象的排序(List和Map)

java实现对象的排序(List和Map)

List和Map的排序

在实际的开发当中,我们经常 在文件浏览的时候经常有多种浏览方式,按时间整箱排序,逆向排序,按大小正逆向排序 ,按 按价格正逆向排序,这些其实都是List和Map中对象的排序,本篇博客不打算从实现文件浏览界面了,因为这些你随便去网上找一下,源码很多,本篇博客打算从java 的实现入门

关于二分查找的,可以参考我的这篇博客二分查找的相关算法题

关于快速排序的,可以参考我的这篇博客快速排序的相关算法题(java)

首先我们先来了解了解一下java帮我们封装好的几种排序

java.util.Collections.sort(java.util.List)

这个要求我们的对象实现java.lang.Comparable接口,并重写compareTo方法

java.util.Collections.sort(java.util.List, java.util.Comparator)

这个要求我们提供Comparator接口的 实例对象,作为比较的基准

那种两种方法有什么不同呢?

1.说白了,实现第一种方法的即对象实现java.lang.Comparable接口可以说是一个内部比较器,以后我们如果要修改排序方式,必须要修改原来的类,这明显违背了java对拓展开饭 ,对修改关闭的原则

2. 实现第二种方法的,相对于第一种方法来说,它可以说是一个外部比较器,修改排序方法,不需要修改原来的代码,相对来说比较灵活

下面我们一起来看一下怎样实现

实现Comparable接口的

如果你有一个新的类,比如Player,那么你要想对其进行排序,就让其实现Comparable接口,并且实现compareTo方法。比如比想按照年龄的大小来排序,从小的进行,那么你就实现如下:

//Product.javaimportjava.util.Date;publicclassProductimplementsComparable{//类内比较privateStringname;privateDatedate;privateintprice;publicintgetPrice(){returnprice;}publicvoidsetPrice(intprice){this.price=price;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicDategetDate(){returndate;}publicvoidsetDate(Datedate){this.date=date;}//用于类内比较@Override//覆写compareTo(Object o)方法publicintcompareTo(Producto){return-this.date.compareTo(o.date);}}

接着我们如果想对List进行排序,我们只需要调用

ListproductList=newArrayList();playerList.add(newProduct()).......Collections.sort(productList);

2.实现第二种方法的,即Comparator接口的

先来看一下product类有什么不同,其实就是不用实现别的接口而已,我们把逻辑主要放在Comparator的实现上

publicclassProduct{privateStringname;privateDatedate;privateintprice;publicintgetPrice(){returnprice;}publicvoidsetPrice(intprice){this.price=price;}publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.name=name;}publicDategetDate(){returndate;}publicvoidsetDate(Datedate){this.date=date;}}

接着我们在来看我们ProductComparator是怎样实现的,其实就是用不同的boolean类型变量实现不同的排序,当然我们一可以考虑用枚举类型去实现,有兴趣的自己可以去搞一下。

//ProductComparator.javaimportjava.util.Date;importjava.util.Comparator;publicclassProductComparatorimplementsComparator{// 对象的排序方式[升、降]publicstaticbooleansortASC=true;// 对象的排序属性publicstaticbooleansortByName=false;publicstaticbooleansortByDate=false;publicstaticbooleansortByPrice=false;@Overridepublicintcompare(Productpro1,Productpro2){intresult=0;if(sortASC){if(sortByName){Stringpro1name=pro1.getName();Stringpro2name=pro2.getName();result=pro1name.compareTo(pro2name);}elseif(sortByDate){Datepro1Date=pro1.getDate();Datepro2Date=pro2.getDate();result=pro1Date.compareTo(pro2Date);}elseif(sortByPrice){Integerpro1Price=pro1.getPrice();Integerpro2Price=pro2.getPrice();result=pro1Price.compareTo(pro2Price);}}else{if(sortByName){Stringpro1name=pro1.getName();Stringpro2name=pro2.getName();result=-pro1name.compareTo(pro2name);}elseif(sortByDate){Datepro1Date=pro1.getDate();Datepro2Date=pro2.getDate();result=-pro1Date.compareTo(pro2Date);}elseif(sortByPrice){Integerpro1Price=pro1.getPrice();Integerpro2Price=pro2.getPrice();result=-pro1Price.compareTo(pro2Price);}}returnresult;}}

写到这里,区别基本已经讲解完毕,接下来看一下测试代码

//测试代码importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Iterator;importjava.util.List;importjava.util.Locale;publicclassProductSort{publicstaticvoidmain(String[]args)throwsParseException{Productpro1=newProduct();pro1.setName("pro1");SimpleDateFormatsdf=newSimpleDateFormat("yyyy-dd-MM",Locale.CHINA);pro1.setDate(sdf.parse("2009-03-23"));pro1.setPrice(89);Productpro2=newProduct();pro2.setName("proc2");pro2.setDate(sdf.parse("2009-02-23"));pro2.setPrice(45);Productpro3=newProduct();pro3.setName("proc3");pro3.setDate(sdf.parse("2009-01-23"));pro3.setPrice(83);Productpro4=newProduct();pro4.setName("proc4");pro4.setDate(sdf.parse("2009-01-23"));pro4.setPrice(800);ListproductList=newArrayList();productList.add(pro1);productList.add(pro3);productList.add(pro2);productList.add(pro4);System.out.println("排序前————————————————————");for(Productp:productList){System.out.println(p.getName()+"----"+p.getPrice()+"----"+p.getDate());}ProductComparablesort=newProductComparable();ProductComparable.sortASC=false;//降序ProductComparable.sortByPrice=true;//设置排序属性生效Collections.sort(productList,sort);System.out.println("排序后————————————————————");for(Iteratoriter=productList.iterator();iter.hasNext();){Productp=(Product)iter.next();System.out.println(p.getName()+"----"+p.getPrice()+"---"+p.getDate());}}}

总结,推荐使用Comparator实现排序

因为 你用一个第三方的类,但他没实现Comparable接口,而你又不能改他代码;另外,类一旦写好后是不允许修改的,但可以扩展,所以只能用Comparator接口

下面讲解怎样实现Map排序

Map是键值对,所以既可以按照键进行排序,也可以按照值进行排序。通常因为键不能同,但是值可以同,所以很多都是用值来进行排序。

### 原理解析

Map遍历的时候要使用一个东西叫做Map.Entry,假如你有一个Map的对象map,那么你可以使用map.entrySet()获取一个set对象,里面装的都是Map.Entry,如果你想遍历,很简单地使用iterator就可以获取里面的所有元素。

如果你要排序,那么就最好是将这个set装到一个list里面去,然后定义一个Comparator对象,在里面实现compare方法,返回一个差值,比如运动员得分的差值,

然后使用Collections.sort方法,将list对象和comparator对象传进去,排序就完成了。

下面看一下例子

publicclassMapSort{publicstaticvoidmain(String[]args){Mapmap=newHashMap();Playerp1=newPlayer("John",1000);Playerp2=newPlayer("Ben",3000);Playerp3=newPlayer("Jack",2000);map.put(p1);map.put(p2);map.put(p3);//将Map里面的所以元素取出来先变成一个set,然后将这个set装到一个list里面List>list=newArrayList>(map.entrySet());//定义一个comparatorComparator>comparator=newComparator>(){@Overridepublicintcompare(Entryp1,Entryp2){//之所以使用减号,是想要按照分数从高到低来排列return-(p1.getValue().score-p2.getValue().score);}};Collections.sort(list,comparator);for(Map.Entryentry:list){System.out.println(entry.getValue().name+":"+entry.getValue().score);}}}classPlayer{Stringname;intscore;publicPlayer(Stringname,intscore){this.name==name;this.score==score;}}

这样排序下来,最后就会输出如下内容

Ben:3000

Jack:2000

John:1000

好了,今天的List,Map排序讲解到此为止,对排序的实现方式还不理解的,建议重新去看一下 八大排序和二分查找,因为这里面的思想很重要

关于二分查找的,可以参考我的这篇博客二分查找的相关算法题

关于快速排序的,可以参考我的这篇博客快速排序的相关算法题(java)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值