構造が
public String name;
public int type;
public String createdOn;
createdOn
は日付で、その形式は次のとおりです。2011-12-16T23:27:27+0000
このタイプのオブジェクトを複数保存ArrayList
しましたが、作成日時に従って並べ替えたいと思います。
を使ってみCollections.sort(....)
ましたが、適切な結果が得られませんでした。
構造が
public String name;
public int type;
public String createdOn;
createdOn
は日付で、その形式は次のとおりです。2011-12-16T23:27:27+0000
このタイプのオブジェクトを複数保存ArrayList
しましたが、作成日時に従って並べ替えたいと思います。
を使ってみCollections.sort(....)
ましたが、適切な結果が得られませんでした。
回答を得た後にいくつかの研究開発を行って、並べ替えの問題を解決しました。これは、配列リストを日付で並べ替えるコードです。
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;
}
});
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);
}
}
独自のカスタムコンパレータを作成する必要があります(こちらをご覧ください)。ほとんどの場合、文字列を解析して日付に戻す必要があります。この以前のSO投稿を見て、日付を比較する方法を確認してください。
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());
カスタムオブジェクトの場合、カスタムコンパレータが必要であるか、クラスを比較可能にする必要があります。
日付文字列を毎回変換することも、文字列を比較することもできます(タイムゾーンが変更されない場合)。
提案されているように、日付を日付または長いものとして保存する方が適切な選択である可能性があります。
カスタムを実装してみましたComparator
か?
new Comparator<CustomObject>() {
public int compare(CustomObject o1, CustomObject o2) {
//compare by date
return <-1 or 0 or 1>;
}
}
hereの指示に従ってください。 Date クラスのメソッドを使用して日付を比較するだけです
クラスは interface を実装する必要がありますComparable
。この場合compareTo()
、必要に応じてメソッドを実装できます。
または、カスタム コンパレータを実装することもできます。
class MyCreationDateComparator implements Comparator<MyClass> {
public int compare(MyClass o1, MyClass o2) {
// implement your logic here.
}
}
Collections.sort()
カスタム コンパレータを受け入れるのバージョンを使用するようになりました。コンパレータが単純な場合は、匿名の内部クラスを使用できます。