在使用List集合時,一般狀況下但願從集合中獲得的對象是按照必定順序排列的,可是List集合的默認排序方式爲按照對象的插入順序,能夠經過java.util.Collections類的靜態方法sort(List<T> list)、sort(List<T> list,Comparator<? super T> c)或reverse(List<?> list)對集合中的對象進行客戶化排序,其中方法sort(List<T> list)和reverse(List<?> list)要求集合中的對象必須實現java.lang.Comparable接口,即實現方法compareTo(),該方法的具體定義以下:
public int compareTo(T o);
方法sort(List<T> list)是將集合中的全部對象按正序排列,方法reverse(List<?> list)是將集合中的全部對象按倒序排列;方法sort(List<T> list,Comparator<? super T> c)不要求集合中的對象必須實現Comparable接口,可是在使用該方法時須要顯式設置比較器,即該方法的第2個入口參數,比較器必須實現java.util.Comparator接口,即實現方法compare(),該方法的就具體定義以下:
int compare(T o1,T o2);
比較器的功能是實現對集合中全部對象的排序策略。
注意:List集合進行客戶化排序的前提條件是List集合中的元素爲同一類型。
一、經過實現java.lang.Comparable接口實現客戶化排序 java
實體類:web
public class Person implements Comparable{ //實現接口Comparable
private String name;
private long id_card;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public long getId_card(){
return id_card;
}
public void setId_card(long id_card){
this.id_card = id_card;
}
public int compareTo(Object o){//實現Comparable接口的方法
Person p = (Person)o;
String s1 = CnToSpell.getFullSpell(this.name);//得到漢字的全拼
String s2 = CnToSpell.getFullSpell(p.getName());
return s1.compareTo(s2);//比較兩個字符串的大小
}
} 測試
測試類:
import java.util.*;
public class TestList{
public static void main(String args[]){
List<Person> list = new ArrayList<Person>();
String names[] = {"馬先生","王小姐","李先生"};
long id_cards[] ={22015,22020,22018};
for(int i=0;i<names.length;i++){//初始化List集合
Person person = new Person();
person.setName(names[i]);
person.setId_card(id_cards[i]);
list.add(person);
}
System.out.println("排序前:");
for(int i=0;i<list.size();i++){//遍歷List集合
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
//利用java.util.Collections類的sort(List list)或reverse(List list)方法對List集合排序
Collections.sort(list);//按升序排序
System.out.println("升序排列後:");
for(int i=0;i<list.size();i++){//遍歷List集合
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
Collections.reverse(list);//按降序排列
System.out.println("降序排列後:");
for(int i=0;i<list.size();i++){//遍歷List集合
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
}
} this
程序的運行結果以下:
排序前:
-----馬先生 22015
-----王小姐 22020
-----李先生 22018
升序排列後:
-----李先生 22018
-----馬先生 22015
-----王小姐 22020
降序排列後:
-----王小姐 22020
-----馬先生 22015
-----李先生 22018
利用這種方式實現對List集合進行客戶化排序,缺點是對於每一個類只能採用一種排序方式,對於排序方式需求單一的對象,可採用該種方式。
二、經過實現java.util.Comparator接口實現客戶化排序 spa
public class Person{
private String name;
private long id_card;
public long getId_card(){
return id_card;
}
public void setId_card(long id_card){
this.id_card = id_card;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
} orm
import java.util.Comparator;
public class PersonComparator implements Comparator{
//爲可能參與排序的屬性定義同名的靜態常量值
public static final int NAME = 1;
public static final int ID_CARD = 2;
private int orderByColumn = 1;//默認排序爲按姓名排序
public int compare(Object o1,Object o2){//實現Comparator接口的方法
Person p1 = (Person)o1;
Person p2 = (Person)o2;
int result = 0;//默認的判斷結果爲兩個對象相等
switch(orderByColumn){//判斷排序條件
case 1://按姓名排序
String s1 = CnToSpell.getFullSpell(p1.getName());//得到漢字的全拼
String s2 = CnToSpell.getFullSpell(p2.getName());
result = s1.compareTo(s2);//比較兩個字符串的大小
break;
case 2:
result = (int)(p1.getId_card()-p2.getId_card());//比較兩個整數的大小
break;
}
return result;
}
public void orderByColumn(int orderByColumn){//用來設置排序條件
this.orderByColumn = orderByColumn;
}
} 對象
public class TestList{
public static void main(String args[]){
List<Person> list = new ArrayList<Person>();
String names[] ={"馬先生","王小姐","李先生"};
long id_cards[] = {22015,22020,22018};
for(int i= 0;i<names.length;i++){
Person person = new Person();
person.setName(names[i]);
person.setId_card(id_cards[i]);
list.add(person);
}
System.out.println("排序前:");
for(int i=0;i<list.size();i++){
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
PersonComparator personComparator = new PersonComparator();//建立比較器對象
System.out.println("按姓名排序:");
Collections.sort(list,personComparator);//默認爲按姓名排序,排序List集合
for(int i=0;i<list.size();i++){
Person person = list.get(i);
System.out.println("-----"+person.getName()+" "+person.getId_card());
}
System.out.println("按編號排序:");
personComparator.orderByColumn(PersonComparator.ID_CARD);//設置爲按編號排序
Collections.sort(list,personComparator);
for(int i=0;i<list.size();i++){
Person person = list.get(i);
System.out.println("-----"+person.getId_card()+" "+ person.getName());
}
}
}
程序的運行結果以下:
排序前:
-----馬先生 22015
-----王小姐 22020
-----李先生 22018
按姓名排序:
-----李先生 22018
-----馬先生 22015
-----王小姐 22020
按編號排序:
-----22015 馬先生
-----22018 李先生
-----22020 王小姐 blog
利用這種方式實現對List集合進行客戶化排序,排除了每一個類只能採用一種排序方式的弊端,能夠根據實際須要,將List集合按照不一樣的方式排序。這裏是按姓名的全稱升序排列,若是想改成降序排列,只需將例子中的的以下代碼: 排序
result = s1.compareTo(s2); 接口
修改改成:
result = s2.compareTo(s2);
編號也是按升序排列的,若是也想改成降序排列,只需將例子中的以下代碼:
result = (int)(p1.getId_card()-p2.getId_card());
修改成:
result = (int)(p2.getId_card()-p1.getId_card());