0

カスタム オブジェクトの配列 ( ListData[]) を 2 つのフィールドで並べ替えています。テーマごと、名前ごとに並べ替えたいです。カスタムオブジェクトクラスで素晴らしいコンパレータ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();.. しかし、配列が空ではないことは確かです。並べ替える前に行をログに記録し、約500個のアイテムで埋めました。

4

1 に答える 1

1

オブジェクトはインターフェースではなくListData実装する必要があります。ComparableComparator

EDIT:

array明確にするために、で並べ替えることができますArray.sort()。カスタムソートを作成するには、でコンパレータを指定できます。指定Array.sort()しない場合、配列は、Comparableインターフェイスを実装することで定義できる自然な順序でソートされます。したがって、カスタムソートする方法には2つのオプションがあります。

  • カスタムコンパレータを使用して、Array.sort()
  • Comparableアイテムへのインターフェースを実装することによって

の実装をお勧めしますComparable。新しいコンパレータオブジェクトを作成しないことでメモリを節約Comparatorできます。これは、異なるタイプのオブジェクトを比較する場合に役立ちますが、そうではありません。

于 2012-07-23T08:54:31.490 に答える