2016-07-03 13 views
0

Ich habe eine Klasse namens NewsItem in meinem Projekt. Ich möchte eine ArrayList von NewsItem auf beide Arten sortieren, absteigend und aufsteigend, wie der Benutzer möchte. Problem ist, dass ich Vergleichbare Schnittstelle verwende und ich entweder ein int mit aufsteigender Bedingung oder absteigender Bedingung zurückgebe und das andere ist kommentiert. Wie kann ich der Collections.sort() -Methode mitteilen, ob die sortierte Liste aufsteigend oder absteigend angezeigt werden soll? Hier ist mein Code.Verwenden vergleichbarer Oberfläche zum Sortieren aufsteigend und absteigend

Jetzt hier Descending ist kommentiert, damit ich einen davon verwenden kann. Ich könnte einen statischen boolean in dieser Klasse verwenden, um entweder eine dieser Bedingungen zu verwenden. Aber seit ich diese Klasse serialisiert habe, habe ich keine statischen Variablen in dieser Klasse verwendet und habe davon Abstand genommen. Jede Hilfe wird geschätzt.

Antwort

4

Ihre Klasse sollte nur eine natürliche Reihenfolge haben. Aber das bedeutet nicht, dass eine Liste Ihrer Klasse die gleiche Reihenfolge haben sollte.

Beim Sortieren Ihrer Liste mit können Sie auch einen Vergleicher übergeben, der ändert, wie diese Sortiermethode Ihre Klasse erkennt.

Ein Beispiel:

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

Dies weist das Sortierverfahren die Rückseite des Verfahrens in der Hauptklasse implementiert zu tun.

Beachten Sie, dass, wenn Java 8 für Android herauskommt, Sie stattdessen die kürzere Collections.sort(yourList, Comparator.reverseOrder()) verwenden können.

0

Volle Zustimmung mit previous answer, aber ich habe noch eine Bemerkung. Für compare Int's können Sie verwenden

Integer.compare(int value1, int value2); 

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

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

Ich mag nicht mit Comparable, da es eine 'natürliche Ordnung' erfordert. Aber was ist eine natürliche Ordnung? Für einen Bibliothekar ist es nach Artikelnummer. Für mich ist es namentlich. Für Sie ist es nach der Erstellungszeit.
Daher ist "natürliche Ordnung" mehrdeutig.

Also ich bin mehr für die Verwendung eines Comparator, die explizit sagen, was Sie brauchen (und erstellen Sie eine CompareByNewsTimeAscending und CompareByNewsTimeDescending Komparator).

Aber was Sie auch tun können, ist einfach zu bestellen es natürlich, und dann die Liste umkehren ...

3

in Java Sie, indem Elemente der Sammlung aller vergleichbaren Schnittstelle implementieren sortieren oder durch Vergleicher Klasse implementieren.

Wenn Sie Comparable in Elementen der Auflistung implementieren, wird die Komparatorsortierung als default sort order verwendet. Wenn Sie also Comparable nur implementieren, können Sie nicht beide Sortierreihenfolgen abrufen.

Was würde ich empfehlen, ist zwei Komparatoren zu haben und verwenden geeignete:

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; 
    } 
} 

Mit zwei Klassen können Sie als haben Ihre Sammlung sortiert aufsteigend oder absteigend wie folgt:

List<NewsItem> items = ... // collection to sort 
boolean ascendingSort = .... // this will control sort order 
Collections.sort(items, ascendingSort ? new AccendingNewsItemComparator() : new DescendingNewsItemComparator());