2016-07-03 18 views
0

私のプロジェクトにNewsItemというクラスがあります。私は、NewsItemのArrayListを、ユーザーが望むように降順と昇順の両方でソートしたい。問題は、私はComparableインターフェイスを使用していると私は、昇順または降順でintを返すか、もう一つはコメントされています。 Collections.sort()メソッドに、昇順または降順ソートされたリストを与える方法を教えてください。ここに私のコードです。昇順と降順の並べ替えのためのComparable Intefaceの使用

@Override 
public int compareTo(NewsItem compNews) { 
    int compTime=((NewsItem)compNews).getNewsTime(); 
    /* For Ascending order*/ 
    return this.NewsTime-compTime; 

    /* For Descending order do like this */ 
    //return compTime-this.NewsTime; 
} 

ここでは下位のものがコメントされていますので、そのうちの1つを使用できます。このクラスで静的なブール値を使用して、これらの条件のいずれかを使用することができます。しかし、私はこのクラスをシリアライズしているので、私はこのクラスで静的変数を使用しておらず、そのようなことを控えています。どんな助けもありがとうございます。

答えて

4

あなたは自然順序が1つしかありません。しかし、これはあなたのクラスのリストが同じ順序を持つべきであるということを意味しません。

Collections.sortを使用してリストを並べ替えるときに、このソート方法でクラスがどのように見えるかを変更するコンパレータを渡すこともできます。

例:

Collections.sort(yourList, new Comparator<NewsItem>(){ 
    public void compare(NewsItem o1, NewsItem o2) { 
     return o2.compareTo(o1); 
    } 
}); 

これはメインクラスに実装された方法の逆を行うためのソート方法を指示します。

Java 8がアンドロイド用に出たときは、代わりにCollections.sort(yourList, Comparator.reverseOrder())を使用することができます。

0

完全にprevious answerに同意しますが、もう1つ発言します。それは自然な順序」を必要とするので、私はComparableを使用して嫌い

Integer.compare(int value1, int value2); 

@Override 
public int compareTo(NewsItem compNews) { 
    int compTime= ((NewsItem) compNews).getNewsTime(); 

    return Integer.compare(compTime, this.NewsTime); 
} 
0

compare Int'sのためには使用することができます。しかし、自然秩序は何ですか?図書館員にとっては、記事番号によるものです。私のために、それは名前である。あなたにとって、それは創造時です。
したがって、「自然順序」はあいまいです。

私は、あなたが必要とするものを明示的に言う(そしてCompareByNewsTimeAscendingとCompareByNewsTimeDescendingコンパレータを作成する)Comparatorをもっと使います。

しかし、あなたもある何ができるか、単に自然にそれを注文した後、あなたは、コレクションの要素がすべてComparableインタフェースを実装することによって並べ替えることができますJavaで

3

、またはコンパレータクラスを実装することで...リストを逆転。

比較要素の並べ替えがdefault sort orderとして使用されるコレクションの要素にComparableを実装すると、Comparableを実装するだけで両方の並べ替え順序を取得することができなくなります。私が推薦する何

は、2個のコンパレータを持ち、適切なものを使用することです:

List<NewsItem> items = ... // collection to sort 
boolean ascendingSort = .... // this will control sort order 
Collections.sort(items, ascendingSort ? new AccendingNewsItemComparator() : new DescendingNewsItemComparator()); 
:あなたがよりあなたのコレクションを昇順にソートしたり、次のように下降することができ、二つのクラスでは

public class AccendingNewsItemComparator implements Comparator<NewsItem> { 
    public int compare(NewsItem a, NewsItem b) { 
     if (a.getNewsTime() < b.getNewsTime()) return -1; 
     if (a.getNewsTime() > b.getNewsTime()) return +1; 
     return 0; 
    } 
} 

public class DescendingNewsItemComparator extends AccendingNewsItemComparator { 
    public int compare(NewsItem a, NewsItem b) { 
     int result = super.compare(a, b); 
     if (result == 0) return 0; 
     return -result; 
    } 
} 

関連する問題