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;
}
});
}
}