2016-06-27 10 views
2

オブジェクト、私はそのフィールドの2で、このプロジェクトをソートしたい:が、私は、オブジェクトが<code>project</code>と呼ばれてい

まず:日(グレゴリオ暦カランダー)によって; 2番目:By Name(String);

私は古いものから新しいものへのプロジェクトをソートしたいと思っています。私がこれを行うことを知っている唯一の方法は、コレクションを逆にすることです。しかし、同じ日付のプロジェクトを名前(アルファベット順)でソートしたいと思います。逆もソートのこの部分を逆にします。

ソート方法の一部のみを逆にする方法はありますか、これを最初に日付(逆)と文字列(通常の順序a-z)でソートする方法はありますか?私はそうのようなオブジェクトcompareToメソッドをオーバーライドしています現時点では

:この日付は、日付引数と値> 0そうする前であれば

@Override 
public int compareTo(Project project) { 
    int i = this.projectDate.compareTo(project.projectDate); 
    if(i != 0) return i; 

    return this.projectName.compareTo(project.projectName); 

} 
+0

だからあなたがする必要があり降順で日付に基づいて並べ替え、日付が等しい場合は、そのサブセットで名前ソートを行う必要がありますか? – aksappy

+0

いいですね。他の人が何を示唆しているか見てみましょう。 Apache Commons CompareToBuilderも動作します。私はそれを一度使ってきました。 – Kartic

答えて

1

Date#compareToは値< 0を返します。

あなたが新しいから古いのソートを逆にしたい場合は、あなただけの負の結果を比較返すことができます。Java 8で

@Override 
public int compareTo(Project project) { 
    int i = this.projectDate.compareTo(project.projectDate); 
    if(i != 0) return -i; // reverse sort 

    return this.projectName.compareTo(project.projectName); 
} 
+0

とてもシンプルで、完璧に動作します、ありがとう:D –

2

を、ComparatorインターフェースはメソッドthenComparingを持っています。このメソッドを使用して、複数のフィールドで比較するコンパレータを作成できます。

あなたは日付によって比較することがアルファベット順やその他を比較するためのコンパレータを持っている場合は、あなたが欲しいのフィールドでソートするコンパレータを組み合わせることができます。

Comparator<Project> nameComparator = ... 
Comparator<Project> dateComparator = ... 

あなたがあれば逆のコンパレータを使用して、コンパレータを混在させることができます必要です。これらは、いくつかの例です:

Comparator<Project> nameAndDateComparator = nameComparator.thenComparing(dateComparator); 
Comparator<Project> nameAndReversedDateComparator = nameComparator.thenComparing(dateComparator.reversed()); 

その後、あなたはあなたのニーズにマッチするコンパレータと、ソートなどの通常の方法を使用することができます。

は、Java 8を使用していない場合、あなたはあなたのコンパレータを組み合わせるために、ユーティリティクラスを作成することができます。

public class CombinedComparator<T> implements Comparator<T> { 

    Comparator<T> firstComparator; 
    Comparator<T> secondComparator; 

    public CombinedComparator(Comparator<T> firstComparator, Comparator<T> secondComparator) { 
     this.firstComparator = firstComparator; 
     this.secondComparator = secondComparator; 
    } 

    @Override 
    public int compare(T o1, T o2) { 
     int result = firstComparator.compare(o1, o2); 
     return (result != 0) ? result : secondComparator.compare(o1, o2); 
    } 

} 

そして、あなたは複数のフィールドを作成することができますが、この方法をコンパレータ:

Comparator<Project> nameAndDateComparator = new CombinedComparator<Project>(nameComparator, dateComparator); 

Comparator<Project> nameAndReversedDateComparator = new CombinedComparator<Project>(nameComparator, Collections.reverseOrder(dateComparator)); 
+0

受け入れられたawnserは、私が今回欲しかったものを得るために必要でした。しかし、より複雑な比較のために私はこれを覚えています、ありがとう –

関連する問題

 関連する問題