0

構造が

public String name;
public int type;
public String createdOn;

createdOnは日付で、その形式は次のとおりです。2011-12-16T23:27:27+0000

このタイプのオブジェクトを複数保存ArrayListしましたが、作成日時に従って並べ替えたいと思います。

を使ってみCollections.sort(....)ましたが、適切な結果が得られませんでした。

4

8 に答える 8

6

回答を得た後にいくつかの研究開発を行って、並べ替えの問題を解決しました。これは、配列リストを日付で並べ替えるコードです。

Collections.sort(arrlst,new Comparator<T>() {

                    public int compare(T lhs, T rhs) {

                        try {
                            SimpleDateFormat dateFormatlhs = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
                            Date convertedDatelhs = dateFormatlhs.parse(lhs.feedCreatedTime);
                            Calendar calendarlhs = Calendar.getInstance();
                            calendarlhs.setTime(convertedDatelhs);

                            SimpleDateFormat dateFormatrhs = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");
                            Date convertedDaterhs = dateFormatrhs.parse(rhs.feedCreatedTime);
                            Calendar calendarrhs = Calendar.getInstance();
                            calendarrhs.setTime(convertedDaterhs);

                            if(calendarlhs.getTimeInMillis() > calendarrhs.getTimeInMillis())
                            {   


                                return -1;
                            }
                            else
                            {


                                return 1;

                            }
                        } catch (ParseException e) {

                            e.printStackTrace();
                        }


                        return 0;
                    }
                });
于 2012-01-10T07:38:12.837 に答える
3

Collections.sort(List<T> list, Comparator<? super T> c)次のようなコンパレータを使用して実装する必要があります

Comparator c = new Comparator<YourObject>() {
    public int compare(YourObject o1, YourObject o2) {
       return o1.createdOn.compareTo(o2.createdOn);
    }
}
于 2012-01-09T14:17:49.383 に答える
2

独自のカスタムコンパレータを作成する必要があります(こちらをご覧ください)。ほとんどの場合、文字列を解析して日付に戻す必要があります。この以前のSO投稿を見て、日付を比較する方法を確認してください。

于 2012-01-09T14:17:53.073 に答える
1

Comparatorを使用するか、カスタムオブジェクトにComparableを実装する必要があります。

Comparableを実装すると、オブジェクトの自然な順序を定義できます。Comparable.compareTo()メソッドでは、現在のオブジェクトを別のオブジェクトと比較して、

  • 現在のオブジェクトが他のオブジェクトより「小さい」場合は負の整数。
  • 現在のオブジェクトが他のオブジェクトと「等しい」場合はゼロ。
  • 現在のオブジェクトが他のオブジェクトより「大きい」場合は正の整数。

例:

public class CustomObject implements Comparable<CustomObject> {

    @Override
    public int compareTo(CustomObject otherOne) {
        // Compare the current object with the otherOne and return an
        // appropriate integer
        return 0;
    }

}

// To sort

Collections.sort(listOfCustomObjects);

反対側から、コンパレータを実装すると、カスタムオブジェクトのコードの外で順序付け基準を指定できます。適切なCollections.sort()メソッドを使用して、コレクション内のオブジェクトの順序を指定できます。Comparator.compare()メソッドは、上記で説明したのと同じルールに従います。

例:

public class CustomObjectComparator implements Comparator<CustomObject> {

    @Override
    public int compare(CustomObject a, CustomObject b) {
        // Compare a with b and return an appropriate integer
        return 0;
    }

}

// To sort

Collections.sort(list, new CustomObjectComparator());
于 2012-01-09T14:34:26.513 に答える
0

カスタムオブジェクトの場合、カスタムコンパレータが必要であるか、クラスを比較可能にする必要があります。

日付文字列を毎回変換することも、文字列を比較することもできます(タイムゾーンが変更されない場合)。

提案されているように、日付を日付または長いものとして保存する方が適切な選択である可能性があります。

于 2012-01-09T14:16:26.877 に答える
0

カスタムを実装してみましたComparatorか?

new Comparator<CustomObject>() {
    public int compare(CustomObject o1, CustomObject o2) {
       //compare by date 
       return <-1 or 0 or 1>;
    }
}
于 2012-01-09T14:17:23.017 に答える
0

hereの指示に従ってください。 Date クラスのメソッドを使用して日付を比較するだけです

于 2012-01-09T14:20:14.083 に答える
0

クラスは interface を実装する必要がありますComparable。この場合compareTo()、必要に応じてメソッドを実装できます。

または、カスタム コンパレータを実装することもできます。

class MyCreationDateComparator implements Comparator<MyClass> {
    public int compare(MyClass o1, MyClass o2) {
        // implement your logic here.
    } 
}

Collections.sort()カスタム コンパレータを受け入れるのバージョンを使用するようになりました。コンパレータが単純な場合は、匿名の内部クラスを使用できます。

于 2012-01-09T14:19:11.393 に答える