Ich habe eine Java-Sammlung:
Collection<CustomObject> list = new ArrayList<CustomObject>();
CustomObject
hat jetzt ein id
-Feld vor der Anzeigeliste. Ich möchte diese Sammlung nach dieser id
sortieren.
Gibt es eine Möglichkeit, das zu tun?
Verwenden Sie einen Comparator :
List<CustomObject> list = new ArrayList<CustomObject>();
Comparator<CustomObject> comparator = new Comparator<CustomObject>() {
@Override
public int compare(CustomObject left, CustomObject right) {
return left.getId() - right.getId(); // use your logic
}
};
Collections.sort(list, comparator); // use the comparator as much as u want
System.out.println(list);
Wenn CustomObject
implements Comparable
, dann verwenden Sie einfach Collections.sort(list)
List<CustomObject> list = getCustomObjectList();
Collections.sort(list, (left, right) -> left.getId() - right.getId());
System.out.println(list);
Viel einfacher
List<CustomObject> list = getCustomObjectList();
list.sort((left, right) -> left.getId() - right.getId());
System.out.println(list);
Am einfachsten
List<CustomObject> list = getCustomObjectList();
list.sort(Comparator.comparing(CustomObject::getId));
System.out.println(list);
Natürlich kann der ursprüngliche Code auch für JDK 8 verwendet werden.
Die Frage ist: "Sort Collection". Sie können also Collections.sort(List<T> l, Comparator<? super T> comparator)
nicht verwenden.
Einige Hinweise:
Für Collection-Typ:
Comparator<String> defaultComparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.compareTo(o2);
}
};
Collection<String> collection = getSomeStringCollection();
String[] strings = collection.toArray(new String[collection.size()]);
Arrays.sort(strings, defaultComparator);
List<String> sortedStrings = Arrays.asList(strings);
Collection<String> collection = getSomeStringCollection();
List<String> list = new ArrayList(collection);
Collections.sort(list, defaultComparator);
collection = list; // if you wish
Für Listentyp:
List<String> list = getSomeStringList();
Collections.sort(list, defaultComparator);
Für Set-Typ:
Set<String> set = getSomeStringSet();
// Than steps like in 'For Collection type' section or use Java.util.TreeSet
// TreeSet sample:
// Sorted using Java.lang.Comparable.
Set<String> naturalSorted = new TreeSet(set);
Set<String> set = getSomeStringSet();
Set<String> sortedSet = new TreeSet(defaultComparator);
sortedSet.addAll(set);
Java 8-Version. Es gibt Java.util.List#sort(Comparator<? super E> c)
Methode
List<String> list = getSomeStringList();
list.sort(defaultComparator);
oder
List<String> list = getSomeStringList();
list.sort((String o1, String o2) -> o1.compareTo(o2));
oder für Typen, die Comparable implementieren:
List<String> list = getSomeStringList();
list.sort(String::compareTo);
Ein etwas anderes Beispiel gibt an, ob Sie über eine Klasse verfügen, die Comparable nicht implementiert, sie jedoch nach Feld oder Methode sortieren möchten.
Collections.sort(allMatching, new Comparator<ClassOne>() {
@Override public int compare(final ClassOne o1, final ClassOne o2) {
if (o1.getMethodToSort() > o2.getMethodToSort()) {
return 1;
} else if (o1.getMethodToSort() < o2.getMethodToSort()) {
return -1;
}
return 0;
}
});
Sie sollten die Comparator
-Schnittstelle implementieren.
beispiel:
public class CustomComparator implements Comparator<CustomObject>
{
@Override
public int compare(CustomObject o1, CustomObject o2) {
return o1.getId().compareTo(o2.getId());
}
}
Dann können Sie die Collections-Klassen Collections.sort()
-Methode verwenden:
Collections.sort(list, new CustomComparator());
Implementieren Sie die Schnittstelle Comparable in Ihrem customObject.
Viele richtige Antworten, aber ich habe diese nicht gefunden: Sammlungen können nicht sortiert werden, Sie können nur durchlaufen werden.
Jetzt können Sie über sie iterieren und eine neue sortierte something
erstellen. Folgen Sie den Antworten hier.
Ab Java 8 können Sie dies nun mit einem Stream mit Lambda tun:
list.stream().sorted(Comparator.comparing(customObject::getId))
.foreach(object -> System.out.println(object));
Verwenden Sie sort .
Sie müssen nur das tun:
Alle Elemente in der Liste müssen die Comparable-Schnittstelle implementieren.
(Oder verwenden Sie die darunter liegende Version, wie andere bereits sagten.)
In Java 8 stehen Ihnen mehrere Optionen zur Verfügung, die Methodenverweise und den integrierten comparing
-Vergleicher kombinieren:
import static Java.util.Comparator.comparing;
Collection<CustomObject> list = new ArrayList<CustomObject>();
Collections.sort(list, comparing(CustomObject::getId));
//or
list.sort(comparing(CustomObject::getId));
SortedSet und Comparator. Der Vergleicher sollte das Feld id berücksichtigen.
Sie können die benutzerdefinierte Java-Klasse zum Sortieren verwenden.