2012-07-23 100 views
0

我在兩個字段上排序自定義對象數組(ListData[])。我希望它按照主題排序,並按名稱排序。我以爲我在自定義對象類中做了一個很好的比較器,並且我可以使用Arrays.sort(ld)來使我的代碼工作並對我的數組進行排序。但很顯然,即時通訊做錯了什麼......在兩個字段上排序自定義對象數組

我的自定義對象:

public class ListData implements Comparable<ListData>{ 
public int venueID; 
public String name; 
public String photoUrl; 
public String tip; 
public String theme; 
@Override 
public int compareTo(ListData ld0) { 
    return this.venueID- ld0.venueID; 
} 

public static Comparator<ListData> ListDataThemeAndNameComparator = new Comparator<ListData>() { 
    @Override 
    public int compare(ListData ld1, ListData ld2) { 

     String compareTheme1 = ld1.theme.toUpperCase(); 
     String compareTheme2= ld2.theme.toUpperCase(); 
     String compareName1 = ld1.name.toUpperCase(); 
     String compareName2= ld2.name.toUpperCase(); 

     //ascending 
     int comp = compareTheme1.compareTo(compareTheme2); // comp themes 
     if(comp==0){ // same theme 
      comp= compareName1.compareTo(compareName2); // compare names 
     } 
     return comp; 
     } 
}; 


} 

在我的主要活動,我有:

ListData ld[]= new ListData[jsonResponse.size()]; 
(some code filling my ListData array) 
Arrays.sort(ld, ListData.ListDataThemeAndNameComparator); // compare by theme and then by name 

有誰知道我做錯了嗎?

我編輯了我的代碼但它仍然失敗,現在在compareTheme1 = ld1.theme.toUpperCase();上出現nullpointerexception。但我相信我的數組不是空的,我在排序它之前記錄了它的行,並且它充滿了大約500個項目。

回答

1

您的ListData對象應該實現Comparable而不是Comparator接口。

EDIT:

爲了把事情說清楚,你可以在array通過Array.sort()排序。要進行自定義排序,您可以在Array.sort()中指定比較器,如果不這樣做,數組將按自然順序排序,您可以通過實現Comparable接口來定義數組。所以,你有兩個選擇如何自定義排序:

  • 通過使用自定義比較,並通過實施Comparable界面,您的項目

我會建議你在Array.sort()

  • 指定它一起去實現Comparable 。通過不創建新的比較對象可以節省內存,如果比較不屬於您的情況的不同類型的對象,則Comparator非常有用。

  • +0

    我編輯了我的代碼,現在我有其他錯誤(在我的問題中解釋)。感謝您的貢獻,但只有將比較變成可比較的(以及進口等)並不能解決我的問題。 – Jasper 2012-07-23 10:04:33

    +0

    你的數組可能不是空的,但似乎你的一些元素沒有主題字段初始化。檢查主題和名稱爲null。 – biegleux 2012-07-23 10:08:49

    +0

    你說得對。我有一些空的字段在數組的末尾,因爲我宣佈了一個大數組。我將其更改爲arraylist,但是當我使用正確的數字它的工作。 – Jasper 2012-07-23 10:22:29

    相關問題