Collections工具類的sort方法
阿新 • • 發佈:2019-02-08
Collections是一個工具類
例如比較常用的Arrays類就是一個工具類,它在java.util.Arrays包中,提供了很多運算元組的各種靜態方法.
Collections工具類在java.util.Collections包中,用來操作Collection物件,也是java集合框架中的一員.
仍然是在慕課學習時老師佈置的小練習,String是按字元的ASCII碼逐個比較排序的
下面就要來談談上面沒說的comparable介面(可比較).
下面測試一下:
例如比較常用的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(); } }
下面是執行結果:
下面就要來談談上面沒說的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中學習一下.