Java中Collections.sort()排序详解
文章目录第一种Comparable 排序接口第二种Comparator比较器接口。两种方法示例再例举一个方法一的示例第一种Comparable 排序接口若一个类实现了Comparable接口就意味着“该类支持排序”。 假设“有一个List列表(或数组)里面的元素是实现了Comparable接口的类”则该List列表(或数组)可以通过 Collections.sort或 Arrays.sort进行排序。此外“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素而不需要指定比较器。classAimplementsComparableA{privateStringname;privateIntegerorder;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicIntegergetOrder(){returnorder;}publicvoidsetOrder(Integerorder){this.orderorder;}OverridepublicStringtoString(){returnname is name order is order;}OverridepublicintcompareTo(Aa){returnthis.order.compareTo(a.getOrder());}}ListAlistnewArrayListA();类A实现接口Comparable并实现compareTo()方法调用Collections.sort(lists)即可实现排序第二种Comparator比较器接口。我们若需要控制某个类的次序而该类本身不支持排序(即没有实现Comparable接口)我们可以建立一个“比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。Collections.sort(list, new PriceComparator())参数一需要排序的list参数二比较器实现Comparator接口的类返回一个int型的值就相当于一个标志告诉sort方法按什么顺序来对list进行排序。Comparator是个接口可重写compare()及equals()这两个方法,用于比较功能如果是null的话就是使用元素的默认顺序如a,b,c,d,e,f,g就是a,b,c,d,e,f,g这样当然数字也是这样的。comparea,b方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。equalsobj方法仅当指定的对象也是一个 Comparator并且强行实施与此 Comparator 相同的排序时才返回 true。两种方法示例packagecom.jabberchina.test;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;publicclassSortTest{staticclassAimplementsComparableA{privateStringname;privateIntegerorder;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicIntegergetOrder(){returnorder;}publicvoidsetOrder(Integerorder){this.orderorder;}OverridepublicStringtoString(){returnname is name order is order;}OverridepublicintcompareTo(Aa){returnthis.order.compareTo(a.getOrder());}}staticclassB{privateStringname;privateStringorder;publicStringgetName(){returnname;}publicvoidsetName(Stringname){this.namename;}publicStringgetOrder(){returnorder;}publicvoidsetOrder(Stringorder){this.orderorder;}OverridepublicStringtoString(){returnname is name order is order;}}publicstaticvoidmain(String[]args){//第一种方法示例ListStringlistsnewArrayListString();lists.add(5);lists.add(2);lists.add(9);//lists中的对象String 本身含有compareTo方法所以可以直接调用sort方法按自然顺序排序即升序排序Collections.sort(lists);//第一种方法示例ListAlistAnewArrayListA();Aa1newA();a1.setName(a1);a1.setOrder(1);Aa2newA();a2.setName(a2);a2.setOrder(2);listA.add(a1);listA.add(a2);//list中的对象A实现Comparable接口Collections.sort(listA);//第二种方法示例ListBlistBnewArrayListB();Bb1newB();b1.setName(b1);b1.setOrder(a);Bb2newB();b2.setName(b2);b2.setOrder(b);listB.add(b1);listB.add(b2);//根据Collections.sort重载方法来实现Collections.sort(listB,newComparatorB(){Overridepublicintcompare(Bb1,Bb2){returnb1.getOrder().compareTo(b2.getOrder());}});System.out.println(lists);System.out.println(listA);System.out.println(listB);}}打印的结果为[2,5,9][name is a1 order is1,name is a2 order is2][name is b1 order is a,name is b2 order is b]再例举一个方法一的示例方法二是一个策略模式可以灵活替换比较器实现不同排序Book实体类publicclassBookimplementsComparable{// 定义名为Book的类默认继承自Object类publicintid;// 编号publicStringname;// 名称publicdoubleprice;// 价格privateStringauthor;// 作者publicGregorianCalendarcalendar;// 出版日期publicBook(){this(0,X,0.0,newGregorianCalendar(),);}publicBook(intid,Stringname,doubleprice,GregorianCalendarcalender,Stringauthor){this.idid;this.namename;this.priceprice;this.calendarcalender;this.authorauthor;}// 重写继承自父类Object的方法满足Book类信息描述的要求publicStringtoString(){StringshowStrid\tname;// 定义显示类信息的字符串DecimalFormatformatPricenewDecimalFormat(0.00);// 格式化价格到小数点后两位showStr\tformatPrice.format(price);// 格式化价格showStr\tauthor;SimpleDateFormatformatDatenewSimpleDateFormat(yyyy年MM月dd日);showStr\tformatDate.format(calendar.getTime());// 格式化时间returnshowStr;// 返回类信息字符串}publicintcompareTo(Objectobj){// Comparable接口中的方法Bookb(Book)obj;returnthis.id-b.id;// 按书的id比较大小用于默认排序}publicstaticvoidmain(String[]args){Bookb1newBook(10000,红楼梦,150.86,newGregorianCalendar(2009,01,25),曹雪芹、高鄂);Bookb2newBook(10001,三国演义,99.68,newGregorianCalendar(2008,7,8),罗贯中 );Bookb3newBook(10002,水浒传,100.8,newGregorianCalendar(2009,6,28),施耐庵 );Bookb4newBook(10003,西游记,120.8,newGregorianCalendar(2011,6,8),吴承恩);Bookb5newBook(10004,天龙八部,10.4,newGregorianCalendar(2011,9,23),搜狐);TreeMaptmnewTreeMap();tm.put(b1,newInteger(255));tm.put(b2,newInteger(122));tm.put(b3,newInteger(688));tm.put(b4,newInteger(453));tm.put(b5,newInteger(40));Iteratorittm.keySet().iterator();Objectkeynull,valuenull;Bookbbnull;while(it.hasNext()){keyit.next();bb(Book)key;valuetm.get(key);System.out.println(bb.toString()\t库存tm.get(key));}}}自定义比较器和测试类packagecom.tjcyjd.comparator;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.GregorianCalendar;importjava.util.Iterator;importjava.util.List;publicclassUseComparator{publicstaticvoidmain(Stringargs[]){ListBooklistnewArrayListBook();// 数组序列Bookb1newBook(10000,红楼梦,150.86,newGregorianCalendar(2009,01,25),曹雪芹、高鄂);Bookb2newBook(10001,三国演义,99.68,newGregorianCalendar(2008,7,8),罗贯中 );Bookb3newBook(10002,水浒传,100.8,newGregorianCalendar(2009,6,28),施耐庵 );Bookb4newBook(10003,西游记,120.8,newGregorianCalendar(2011,6,8),吴承恩);Bookb5newBook(10004,天龙八部,10.4,newGregorianCalendar(2011,9,23),搜狐);list.add(b1);list.add(b2);list.add(b3);list.add(b4);list.add(b5);// Collections.sort(list); //没有默认比较器不能排序System.out.println(数组序列中的元素:);myprint(list);Collections.sort(list,newPriceComparator());// 根据价格排序System.out.println(按书的价格排序:);myprint(list);Collections.sort(list,newCalendarComparator());// 根据时间排序System.out.println(按书的出版时间排序:);myprint(list);}// 自定义比较器按书的价格排序staticclassPriceComparatorimplementsComparator{publicintcompare(Objectobject1,Objectobject2){// 实现接口中的方法Bookp1(Book)object1;// 强制转换Bookp2(Book)object2;returnnewDouble(p1.price).compareTo(newDouble(p2.price));}}// 自定义比较器按书出版时间来排序staticclassCalendarComparatorimplementsComparator{publicintcompare(Objectobject1,Objectobject2){// 实现接口中的方法Bookp1(Book)object1;// 强制转换Bookp2(Book)object2;returnp2.calendar.compareTo(p1.calendar);}}// 自定义方法分行打印输出list中的元素publicstaticvoidmyprint(ListBooklist){Iteratoritlist.iterator();// 得到迭代器用于遍历list中的所有元素while(it.hasNext()){// 如果迭代器中有元素则返回trueSystem.out.println(\tit.next());// 显示该元素}}}参考java中Collections.sort排序详解java基础—— Collections.sort的两种用法简单明了 。java List 排序 Collections.sort()Java 中 Comparable 和 Comparator 比较