2011-05-04 64 views
0

Collections.sort(應用程序,新的ResolveInfo.DisplayNameComparator(經理)); 這是一個排序函數。第一個參數是一個要排序的數組。 爲什麼我們需要第二個參數?第二個參數可以做什麼?Collections.sort

+2

你應該問更多的問題之前接受一些答案! – MobileCushion 2011-05-04 14:02:07

回答

3

Sort第二個參數是Comparable這樣你就可以比較的對象提供自定義功能。

Collections.sort(apps,new ResolveInfo.DisplayNameComparator(manager));

看來這使用比較器,通過顯示名稱比較對象。

+0

陣列的應用程序包含姓名和icons.So我困惑爲什麼我們需要第二個參數? – 2011-05-04 14:09:49

+0

@ zhen01.wang:不,「數組應用程序」不包含名稱和圖標。 'apps'是一個'List '。如果沒有,你的代碼將不能編譯。 – CommonsWare 2011-05-04 15:13:37

+0

@CommonsWare:沒有,DisplayNameComparator可以是靜態內部類ResolveInfo的,所以你分不清什麼是模板。 – 2011-05-04 15:15:51

0

appsResolveInfo對象的列表。 ResolveInfo不是Comparable,這意味着因爲它不實現Comparable接口,所以沒有關於如何比較兩個ResolveInfo對象的「規則」。 sort(List<T> list)方法需要在列表中的對象是可比較:

public static <T extends Comparable<? super T>> void sort(List<T> list) 

DisplayNameComparator定義瞭如何通過應用的顯示名稱它們代表比較ResolveInfo對象的邏輯。

的源代碼:

public static class DisplayNameComparator 
     implements Comparator<ResolveInfo> { 
    public DisplayNameComparator(PackageManager pm) { 
     mPM = pm; 
     mCollator.setStrength(Collator.PRIMARY); 
    } 

    public final int compare(ResolveInfo a, ResolveInfo b) { 
     CharSequence sa = a.loadLabel(mPM); 
     if (sa == null) sa = a.activityInfo.name; 
     CharSequence sb = b.loadLabel(mPM); 
     if (sb == null) sb = b.activityInfo.name; 

     return mCollator.compare(sa.toString(), sb.toString()); 
    } 

    private final Collator mCollator = Collator.getInstance(); 
    private PackageManager mPM; 
}