Ich habe eine Liste von Objekten wie. List<Object> p
Ich möchte diese Liste alphabetisch anhand des Felds Objektname sortieren. Das Objekt enthält 10 Felder und das Namensfeld ist eines davon.
if (list.size() > 0) {
Collections.sort(list, new Comparator<Campaign>() {
@Override
public int compare(final Object object1, final Object object2) {
return String.compare(object1.getName(), object2.getName());
}
} );
}
Aber es gibt nichts wie String.compare ..?
Object
s haben keine Namen. Meinst du mit.toString()
?object1
undobject2
müssen vom Typ seinCampaign
, und die Vergleichsfunktion istobject1.getName().compareTo(object2.getName())
.List<Object>
undComparator<Campaign>
. Das kannst du nicht machen. Entweder Sie habenList<Object>
undComparator<Object>
oderList<Campaign>
undComparator<Campaign>
Antworten:
Aus Ihrem Code geht hervor, dass Ihr Code
Comparator
bereits mit parametriert istCampaign
. Dies funktioniert nur mitList<Campaign>
. Die gesuchte Methode ist auchcompareTo
.Oder wenn Sie Java 1.8 verwenden
Ein letzter Kommentar - es macht keinen Sinn, die Listengröße zu überprüfen. Die Sortierung funktioniert für eine leere Liste.
quelle
Comparator.comparing(Campaign::getName)
list.sort((object1, object2) -> object1. getName().compareTo(object2. getName()));
arbeitete für michsortedList = list.stream().sort((object1, object2) -> object1. getName().compareTo(object2. getName()))..collect(Collectors.toList());
, um eine neue sortierte Liste zu erhaltenCollator
Aufgrund der Internationalisierung ist die Verwendung alphabetischer Zeichenfolgen die korrekteste Methode . Einige Sprachen haben aufgrund weniger zusätzlicher Zeichen usw. eine andere Reihenfolge.Wenn Sie sich nicht für Internationalisierung interessieren, verwenden Sie
string.compare(otherString)
.quelle
Schauen Sie sich
Collections.sort()
dieComparator
Benutzeroberfläche an.Der String-Vergleich kann mit
object1.getName().compareTo(object2.getName())
oder erfolgenobject2.getName().compareTo(object1.getName())
(abhängig von der gewünschten Sortierrichtung).Wenn Sie möchten, dass die Sortierung fallunabhängig ist, tun Sie dies
object1.getName().toUpperCase().compareTo(object2.getName().toUpperCase())
.quelle
nama
aus demObject
Typ zu extrahieren ? Diese Antwort ist nicht vollständig.Verwenden von Java 8 Comparator.Vergleichen :
quelle
Bitte ersetzen Sie Object durch Ihre Klasse, die das Namensfeld enthält
Verwendung:
quelle
obj1.getName().compareTo(obj2.getName()
mitobj2.getName().compareTo(obj1.getName()
in der Vergleichsklasseetwas wie
quelle
Hier ist eine Version der Antwort von Robert B,
List<T>
die mit Reflection und ohne Bibliotheken von Drittanbietern für eine bestimmte String-Eigenschaft des Objekts funktioniert und diese sortiertquelle
Sie können
sortThisBy()
aus Eclipse-Sammlungen verwenden :Wenn Sie den Listentyp nicht ändern können von
List
:Hinweis: Ich bin ein Mitarbeiter von Eclipse Collections.
quelle
Versuche dies:
quelle
Wenn Ihre Objekte einen gemeinsamen Vorfahren haben, sollten
T
SieList<T>
stattdessenList<Object>
einen Komparator für dieses T verwenden und mithilfe des Namensfelds implementieren .Wenn Sie keinen gemeinsamen Vorfahren haben, können Sie einen Comperator implementieren und Reflection verwenden , um den Namen zu extrahieren. Beachten Sie, dass die Verwendung von Reflection unsicher und nicht empfehlenswert ist und unter einer schlechten Leistung leidet. Sie können jedoch auf einen Feldnamen zugreifen ohne etwas über den tatsächlichen Typ des Objekts zu wissen [abgesehen von der Tatsache, dass es ein Feld mit dem entsprechenden Namen hat]
In beiden Fällen sollten Sie Collections.sort () zum Sortieren verwenden.
quelle
Ich habe einen anderen Weg gefunden, um den Typ zu machen.
quelle
Dies setzt eine Liste von
YourClass
statt stattObject
, wie von amit erklärt .Sie können dieses Bit aus der Google Guava-Bibliothek verwenden:
Die anderen Antworten, die erwähnt werden,
Comparator
sind nicht falsch, daOrdering
implementiertComparator
. Diese Lösung ist meiner Meinung nach etwas einfacher, obwohl es schwieriger sein kann, wenn Sie Anfänger sind und nicht daran gewöhnt sind, Bibliotheken und / oder "funktionale Programmierung" zu verwenden.Schamlos von dieser Antwort auf meine eigene Frage kopiert .
quelle
Verwenden einer Auswahl Sortieren
quelle
Collections.sort()
? (2) Die Liste ist vom TypList<Object>
und wird daherlist.get(j).getName()
nicht kompiliert. (3) Diese Lösung ist O (n ^ 2), während die VerwendungCollections.sort()
eine bessere O (nlogn) -Lösung ist.Wenn Sie a verwenden
List<Object>
, um Objekte eines Subtyps mit einemNamedObject
Namensfeld zu speichern (nennen wir den Subtyp ), müssen Sie die Listenelemente herunterwerfen, um auf den Namen zugreifen zu können. Sie haben 3 Möglichkeiten, von denen die beste die erste ist:List<Object>
wenn Sie helfen können - bewahren Sie Ihre benannten Objekte in a aufList<NamedObject>
List<Object>
Elemente in einList<NamedObject>
Downcasting- Element , führen Sie die Sortierung durch und kopieren Sie sie dann zurückOption 3 würde folgendermaßen aussehen:
quelle
quelle
@ Victors Antwort hat bei mir funktioniert und sie hier in Kotlin erneut veröffentlicht, falls sie für jemanden nützlich ist, der Android macht.
quelle