1. 程式人生 > >Collections工具類的sort方法

Collections工具類的sort方法

Collections是一個工具類
例如比較常用的Arrays類就是一個工具類,它在java.util.Arrays包中,提供了很多運算元組的各種靜態方法.
Collections工具類在java.util.Collections包中,用來操作Collection物件,也是java集合框架中的一員.

它擁有一個sort()方法


關於comparable待會再介紹,先用sort()實現簡單的排序功能,下面這個案例是給Integer泛型的list排序

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * @author lune
 * 
 * 通過Collections.sort()方法,對Integer泛型的List進行排序
 * 對String泛型的List進行排序
 */
public class CollectionsTest {
	
	/**
	 * 對Integer泛型的List進行排序
	 * 建立一個Integer泛型的List,插入十個100以內不重複的隨機整數
	 */
	public void sortInterger(){
		List<Integer> integerList = new ArrayList<Integer>();
		Random random = new Random();
		Integer integer;
		for(int i = 0 ; i<10 ; i++){
			do{
				integer = random.nextInt(100);
			}while(integerList.contains(integer));      //如果包含此整數,則重新生成
			integerList.add(integer);
			System.out.println("添加了整數"+integer);
		}
		System.out.println("--------------排序前---------------");
		for(Integer in:integerList){
			System.out.print(in+"  ");
		}
		System.out.println("\n\n");
		Collections.sort(integerList);
		System.out.println("--------------排序後---------------");
		for(Integer in:integerList){
			System.out.print(in+"  ");
		}
		
	}

	
	public static void main(String[] args) {
		new CollectionsTest().sortInterger();

	}

}
在貼出一個小作業
仍然是在慕課學習時老師佈置的小練習,String是按字元的ASCII碼逐個比較排序的

下面貼出我自己的程式碼

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

/**
 * @author lune
 *
 */
public class SortDemo {
	
	static List<String> stringList;
	
	/**
	 * 向stringList中新增十條長度在10以內的隨機字串
	 */
	public void test(){
		stringList = new ArrayList<String>();
		Random random = new Random();
		String str = null;
		for(int i=0 ; i<10 ; i++){
			int length = random.nextInt(10);              //生成隨機長度
			do{
				str = createRandomString(length);
			}while(stringList.contains(str));            //若包含相同的字串,則重新生成字串
			
			System.out.println("將要新增的字串:"+str);
			stringList.add(str);
		}
		System.out.println("--------------排序前---------------");
		show();
		Collections.sort(stringList);
		System.out.println("--------------排序後---------------");
		show();
	}
	
	/**
	 * 該方法生成一個長度為length隨機字串
	 */
	public String createRandomString(int length){
		String base = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
		//根據base的長度獲取隨機數,將這個隨機數作為base的下標
		Random random = new Random();
		StringBuffer sb = new StringBuffer();
		for(int i=0 ; i<length ;i++){
			int index = random.nextInt(base.length());
			sb.append(base.charAt(index));
		}
		return sb.toString();
		
	}
	
	//顯示stringList
	public void show(){
		for(String str:stringList){
			System.out.println(str);
		}
	}

	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new SortDemo().test();
	}

}

下面是執行結果:


到這裡,大家是否覺得困惑,既然只是對Integer,String進行排序,那為什麼不直接用一個數組,然後用Arrays工具類中的sort()方法直接排序呢?那麼請思考這個問題,如果有一個Teacher類,含有id和name屬性,那麼如何根據id或者name對List<Teacher>排序呢?
下面就要來談談上面沒說的comparable介面(可比較).

排序,實際上可以看作是一個比較的過程,例如對整數排序,對大小比較,然後按一定順序排列。那麼對於Teacher物件,既有id,又有name.假如List<Teacher>中有很多Teacher物件,系統並不能確定集合中的元素是否能進行比較,並且系統如何知道要以哪一種標準去比較所有的物件呢?

對於基本包裝類以及String型別,都實現了Comparable介面.對於Integer,因為數值大小的不同,就可以說Integer是可以比較的.很顯然,如果兩個事物要進行排序,首先它們必須是可以比較的,而比較通常是指這兩個事物在某一方面或者某幾方面的特性可比較.

如果兩個學生,升高不同,體重也不同,那麼給他們進行排序時就必須說明,是按身高排序,還是按體重排序.


對於sort()排序的集合中的物件都必須實現Comparable介面.那麼理所當然,如果要對Teacher泛型集合進行排序,Teacher類必須實現Comparable介面,相當於給物件指定了預設的排序規則,必須實現該介面的compareTo()方法,當兩個實現了Comparable介面的類的例項進行比較時,就會呼叫compareTo()方法.
如果A物件compareTo B物件,返回正數表示A物件比B物件大,負數表示小,0表示相等.

public class Teacher implements Comparable<Teacher>{
	public String id;
	public String name;
	
	public Teacher(String id , String name){
		this.id = id;
		this.name = name;
	}

	@Override
	public int compareTo(Teacher o) {
		
		return this.id.compareTo(o.id);
	}	
}
Comparable<T>指定該類的例項會和泛型T的例項進行比較,由於這裡是兩個Teacher物件比較,則指定T為Teacher.其中由於id是String型別實現了Comparable介面,因此只需要返回id的比較結果.
下面測試一下:
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;

/**
 * @author lune
 *
 */
public class SortTeacher {
	public void test(){
		List<Teacher> teachers = new ArrayList<Teacher>();
		teachers.add(new Teacher("2", "wang"));
		teachers.add(new Teacher("3", "cheng"));
		teachers.add(new Teacher("1", "li"));
		Collections.sort(teachers);
		for(Teacher t:teachers){
			System.out.println(t.id+t.name);
		}
	}
	public static void main(String[] args) {
		new SortTeacher().test();

	}

}
大功告成,實際上還有一個Comparator介面,它定義的是臨時比較規則,而不是預設比較規則.介面的實現類必須實現compare()方法.有興趣的可以在API中學習一下.