Java中对list元素进行排序的方法详解
在JavaCollectionFramework中定义的List实现有Vector,ArrayList和LinkedList。这些集合提供了对对象组的索引访问。他们提供了元素的添加与删除支持。然而,它们并没有内置的元素排序支持。
你能够使用java.util.Collections类中的sort()方法对List元素进行排序。你既可以给方法传递一个List对象,也可以传递一个List和一个Comparator。如果列表中的元素全都是相同类型的类,并且这个类实现了Comparable接口,你可以简单的调用Collections.sort()。如果这个类没有实现Comparator,你也可以传递一个Comparator到方法sort()中,进行排序。如果你不想使用缺省的分类顺序进行排序,你同样可以传递一个Comparator到方法sort()中来进行排序。
1.比较的对象实现Comparable接口
publicclassStudentimplementsComparable{ privateintid; privateintage; privateStringname; publicStudent(intid){ this.id=id; } publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicintgetAge(){ returnage; } publicvoidsetAge(intage){ this.age=age; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicstaticvoidmain(Stringargs[]){ List<Student>list=newArrayList<Student>(); for(inti=1000;i>0;i--){ list.add(newStudent(i)); } Collections.sort(list); for(Students:list){ System.out.println(s.getId()); } } publicintcompareTo(Objecto){ if(oinstanceofStudent){ Students=(Student)o; if(this.id>s.id){ return1; } else{ return0; } } return-1; } }
2.利用Collections.sort(Objecto,Comparatorc)
publicclassJiaMenuComparatorimplementsComparator{ publicintcompare(Objecto1,Objecto2){ if(null!=o1&&null!=o2) { JiaMenumenu1=(JiaMenu)o1; JiaMenumenu2=(JiaMenu)o2; if(menu1.getId()<menu2.getId()){ return1; }else{ return0; } } return0; } }
3.对List元素中的多个属性进行排序(用到commons-beanutils)
commons-beanutils类库中有一个BeanComparator类,可以用来给JavaBean排序。但是这个类一次只能对一个属性排序。下面是一个利用BeanComparator实现对JavaBean的多个属性进行排序的例子,非常简单:
importorg.apache.commons.beanutils.BeanComparator; importjava.util.Collections; importjava.util.Comparator; importjava.util.List; /** *对List元素的多个属性进行排序的类 */ @SuppressWarnings({"unchecked"}) publicclassListSorter{ /** *List元素的多个属性进行排序。例如ListSorter.sort(list,"name","age"),则先按 *name属性排序,name相同的元素按age属性排序。 * *@paramlist包含要排序元素的List *@paramproperties要排序的属性。前面的值优先级高。 */ publicstatic<V>voidsort(List<V>list,finalString...properties){ Collections.sort(list,newComparator<V>(){ publicintcompare(Vo1,Vo2){ if(o1==null&&o2==null)return0; if(o1==null)return-1; if(o2==null)return1; for(Stringproperty:properties){ Comparatorc=newBeanComparator(property); intresult=c.compare(o1,o2); if(result!=0){ returnresult; } } return0; } }); } }