Sortieren einer ArrayListe von Objekten mit Vergleichs- und Komparator

In diesem Tutorial erfahren Sie, wie Sie eine ArrayList, die Objekte enthält, mithilfe der beiden Schnittstellen java.lang.Comparable und java.util.Comparator sortieren. Wenn Ihr Programm das Sortieren einer ArrayList von String oder Integer erfordert, lesen Sie am besten diese beiden Artikel:

- Sortieren einer String- oder Integer-ArrayList
- Sortieren einer ArrayList in absteigender Reihenfolge

Die vergleichbare Schnittstelle wird verwendet, wenn Sie eine Liste von Objekten sortieren möchten, indem Sie zwei Objekte mit der vordefinierten Methode object1.compareTo(object2).

Sortieren einer ArrayList mit Comparable

Zuerst sehen wir uns das Sortierergebnis einer Arraylist von Objekten an, ohne die vergleichbare Schnittstelle zu implementieren.

Erstellen wir eine Employe.java Klasse:

public class Employee {

private String name;
private int age;
privates Langgehalt;

public String getName() {
Name zurückgeben;
}

public int getAge() {
return age;
}

public long getSalary() {
return salary;
}

public Employee(String name, int age, int salary) {
this.name = name;
this.age = Alter;
this.salary = Gehalt;
}

@Override
//Diese Methode zeigt Mitarbeiterinformationen an
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}
}
Wir möchten eine Liste von ArrayList erstellen< Mitarbeiter>:

import java.util.ArrayList; 
import java.util.Collections;

public class ArrayListComparable {

public static void main(String[] args) {
ArrayList< Mitarbeiter> arraylist = neue ArrayList< Mitarbeiter> ();
arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));

System.out.println("Geordnete Liste der Mitarbeiter:\n"+Collections.sort(arraylist));
}
}
Aufruf des Collections.sort() verursachen ein Problem, da es für eine ArrayList von Objekten ausgeführt wird, die nur funktioniert, wenn Sie sowohl die Vergleichs- als auch die Komparatorschnittstelle verwenden. Es erscheint ein Kompilierungsfehler:

Ausnahme im Thread "main" java.lang.Fehler: Ungelöste Kompilierungsprobleme: 
Der Operator + ist für den/die Argumenttyp(e) nicht definiert String, void
Gebundene Diskrepanz: Die generische Methode sort(List) vom Typ Collections ist für die Argumente (ArrayList) nicht anwendbar. Der abgeleitete Typ Employe ist kein gültiger Ersatz für den Begrenzungsparameter >

at ArrayListComparable.main(ArrayListComparable.java:14)

Jetzt müssen Sie die Bedeutung dieser beiden Schnittstellen verstanden haben.

Nehmen wir an, wir möchten die Liste nach der Eigenschaft sortieren: Gehalt des Mitarbeiters. Dies kann durch Implementieren der vergleichbaren Schnittstelle erfolgen, und dann führt Java einen automatischen Vergleich mit dem compareTo()declared Override.

Nach der Implementierung der vergleichbaren Schnittstelle in der Employe.java-Klasse sieht das Ergebnis wie folgt aus:

public class Employe implementiert Comparable< Mitarbeiter> {

private Zeichenfolgenname;
private int age;
privates Langgehalt;

public String getName() {
Name zurückgeben;
}

public int getAge() {
return age;
}

public long getSalary() {
return salary;
}

public Employee(String name, int age, int salary) {
this.name = name;
this.age = Alter;
this.salary = Gehalt;
}

@Override
//Diese Methode zeigt Mitarbeiterinformationen an
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}

@Override
public int compareTo(Employee emp) {
//sortiere Mitarbeiter nach Alter in der Reihenfolge croiddant
//retroune eine negative, null oder positive Ganzzahl, wenn das Alter
//des Mitarbeiters kleiner, gleich oder größer als das Objekt ist, verglichen mit
return (this.age - emp.age);
}
}
Jetzt haben wir das Recht, die Methode Collections.sort():

import java.util.ArrayList; 
import java.util.Collections;

public class ArrayListComparable {

public static void main(String[] args) {
ArrayList< Mitarbeiter> arraylist = neue ArrayList< Mitarbeiter> ();

arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));

Sammlungen.sort(arraylist);

System.out.println("geordnete Liste der Mitarbeiter nach Alter:\n");
for(Mitarbeiter e:arraylist)
System.out.println(e);
}
}
Wenn wir diesen Code ausführen, erhalten wir das folgende Ergebnis:

geordnete Liste der Mitarbeiter nach Alter:

[name=katia, age=26, salary=10000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]
[name=mateo, age=32, salary=20000]

Sortieren einer ArrayList mit Comparator

Wie Sie sehen können, ist die Liste der Mitarbeiter oben in aufsteigender Reihenfolge sortiert. aber warum dann die Comparator-Schnittstelle verwenden? Weil es Situationen geben kann, in denen die Sortierung im Gegensatz zu Comparable auf mehreren Parametern basiert. Zum Beispiel möchten wir, dass die Sortierung von Mitarbeitern nach Name, Alter und Gehalt erfolgt.

Die compare(Object o1, Object o2) der Comparator-Schnittstelle verwendet zwei Objekte. In unserem Beispiel muss es dreimal implementiert werden (Name, Alter und Gehalt), damit es eine negative Ganzzahl zurückgibt, wenn das erste Argument kleiner als das zweite ist, und Null, wenn sie gleich sind, und eine positive Ganzzahl, wenn das erste Argument größer als das zweite ist.

import java.util.Comparator; 

public class Mitarbeiter {

private Name der Zeichenfolge;
private int age;
privates Langgehalt;

public String getNom() {
Name zurückgeben;
}

public int getAge() {
return age;
}

public long getSalary() {
return salary;
}

public Employee(String name, int age, int salary) {
this.name = name;
this.age = Alter;
this.salary = Gehalt;
}

@Override
//Diese Methode zeigt Mitarbeiterinformationen an
public String toString() {
return "[name=" + this.name + ", age=" + this.age + ", salary=" +
this.salary + "]";
}

/*
* Komparator zum Sortieren von Mitarbeitern nach Namen
*/
öffentlicher statischer Komparator< Mitarbeiter> ComparatorName = neuer Comparator< Mitarbeiter> () {

@Override
public int compare(Mitarbeiter e1, Mitarbeiter e2) {
return e1.getName().compareTo(e2.getName());
}
};
/*
* Komparator zum Sortieren von Mitarbeitern nach Alter
*/
öffentlicher statischer Komparator< Mitarbeiter> ComparatorAge = neuer Comparator< Mitarbeiter> () {

@Override
public int compare(Mitarbeiter e1, Mitarbeiter e2) {
return (int) (e1.getAge() - e2.getAge());
}
};
/*
* Komparator zum Sortieren von Mitarbeitern nach Gehalt
*/
öffentlicher statischer Komparator< Mitarbeiter> ComparatorSalary = neuer Comparator< Mitarbeiter> () {

@Override
public int compare(Mitarbeiter e1, Mitarbeiter e2) {
return (int) (e1.getSalary() - e2.getSalary());
}
};
}
Die Testklasse main:

import java.util.ArrayList; 
import java.util.Collections;

public class main{

public static void main(String[] args) {
ArrayList< Mitarbeiter> arraylist = neue ArrayList< Mitarbeiter> ();

arraylist.add(new Employe("mateo", 32, 20000));
arraylist.add(new Employe("katia", 26, 10000));
arraylist.add(new Employe("aline", 30, 40000));
arraylist.add(new Employe("salim", 28, 35000));

//Sortieren nach Name
Collections.sort(arraylist, Employee.ComparatorName);

System.out.println("geordnete Liste der Mitarbeiter nach Namen:");
for(Mitarbeiter e:arraylist)
System.out.println(e);

//nach Alter sortieren
Collections.sort(arraylist, Employee.ComparatorAge);

System.out.println("geordnete Liste der Mitarbeiter nach Alter:");
for(Mitarbeiter e:arraylist)
System.out.println(e);

//sort by salary
Collections.sort(arraylist, Employee.ComparatorSalary);

System.out.println("geordnete Liste der Mitarbeiter nach Gehalt:");
for(Mitarbeiter e:arraylist)
System.out.println(e);
}
}
Die Ausführung dieses Codes ergibt:

geordnete Liste der Mitarbeiter nach Name:
[name=aline, age=30, salary=40000]
[name=katia, age=26, salary=10000]
[name=mateo, age=32, salary=20000]
[name=Salim, age=28, salary=35000]
geordnete Liste der Mitarbeiter nach Alter:
[name=katia, age=26, salary=10000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]
[name=mateo, age=32, salary=20000]
geordnete Liste der Mitarbeiter nach Gehalt:
[name=katia, age=26, salary=10000]
[name=mateo, age=32, salary=20000]
[name=salim, age=28, salary=35000]
[name=aline, age=30, salary=40000]