对List进行排序主要是分为两种类型,一种是对基本数据类型的排序:
例如:
List<Integer> num = new ArrayList<Integer>();
num.add(3);
num.add(2);
num.add(4);
num.add(1);
System.out.println(num);
Collections.sort(num);
System.out.println(num);
输出为: 1 2 3 4
另一种是对对象中某一属性进行排序:
例如,emp对象有 name,age属性
emp.java
package com.test;
public class emp {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public emp(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
test.java
public static void main(String[] args) {
List<emp> list1 = new ArrayList<emp>();
emp emp1 = new emp("张飞",23);
emp emp2 = new emp("李四",24);
emp emp3 = new emp("张b",21);
list1.add(emp1);
list1.add(emp2);
list1.add(emp3);
Collections.sort(list1,new Comparator<emp>() {
@Override
public int compare(emp e1, emp e2) {
// TODO Auto-generated method stub
return e1.getAge()-e2.getAge();
}
});
for(int i=0;i<list1.size();i++){
System.out.println(list1.get(i).getName()+" "+list1.get(i).getAge());
}
}
那么对于emp的name属性如何进行排序呢?
我们可以依照上面的age属性,使用compareTo()对字符串进行比较。
public static void NameSort(List<emp> list) {
Collections.sort(list,new Comparator<emp>() {
@Override
public int compare(emp e1, emp e2) {
// TODO Auto-generated method stub
return e1.getName().compareTo(e2.getName());
}
});
System.out.println("按照一般字符串对name排序:");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).getName()+" "+list.get(i).getAge());
}
}
对于汉字来说,有时候需要对汉字首字母进行排序,那么 就不能使用前面的方法了,需要引入java.text.Collator.getInstance()设置自定义排序规则,选择中国地区包java.util.Locale.CHINA并且需要将排序后的对象类型转换为java.text.RuleBasedCollator。代码如下:
public static void sortByRuleBasedCollator(List<emp> list){
Collections.sort(list, new Comparator<emp>(){
@Override
public int compare(emp e1, emp e2) {
// TODO Auto-generated method stub
return ((java.text.RuleBasedCollator)java.text.Collator.getInstance(java.util.Locale.CHINA)).compare(e1.getName(), e2.getName());
}
});
System.out.println("按照汉字首字母对name排序:");
for(int i=0;i<list.size();i++){
System.out.println(list.get(i).getName()+" "+list.get(i).getAge());
}
}
测试类如下:
public static void main(String[] args) {
List<emp> list1 = new ArrayList<emp>();
emp emp1 = new emp("张三",23);
emp emp2 = new emp("李四",24);
emp emp3 = new emp("王五",21);
emp emp4 = new emp("李一",24);
emp emp5 = new emp("王二",21);
list1.add(emp1);
list1.add(emp2);
list1.add(emp3);
list1.add(emp4);
list1.add(emp5);
System.out.println("排序前:");
for(int i=0;i<list1.size();i++){
System.out.println(list1.get(i).getName()+" "+list1.get(i).getAge());
}
NameSort(list1);
sortByRuleBasedCollator(list1);
}
结果:
排序前:
张三 23
李四 24
王五 21
李一 24
王二 21
按照age排序:
王五 21
王二 21
张三 23
李四 24
李一 24
按照一般方式对name排序:
张三 23
李一 24
李四 24
王二 21
王五 21
按照汉字首字母对name排序:
李四 24
李一 24
王二 21
王五 21
张三 23