web-dev-qa-db-de.com

Java-Sammlung sortieren

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? 

69
Makky

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 CustomObjectimplements Comparable, dann verwenden Sie einfach Collections.sort(list)

Mit JDK 8 ist die Syntax viel einfacher.

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.

146
Kowser

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);
27
Aliaksei Yatsau

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;
  }
});
11
Shawn Vader

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());
6
Hunter McMillen

Implementieren Sie die Schnittstelle Comparable in Ihrem customObject. 

5
DwB

Comparator ist der Weg

Siehe auch 

4
Jigar Joshi

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.

4
estani

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));
3
SebastianM.

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.)

2
Ziyao Wei

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));
1
assylias

SortedSet und Comparator. Der Vergleicher sollte das Feld id berücksichtigen.

0

Sie können die benutzerdefinierte Java-Klasse zum Sortieren verwenden.

0
user7225794