Um in einem Array oder einer Sammlung gespeicherte Objekte desselben Typs zu organisieren, haben Java-Entwickler die
Eine der einfachsten und effektivsten Möglichkeiten, ein Array von Objekten zu sortieren, ist die
Comparable
. Es deklariert nur eine Methode compareTo
:
public interface Comparable<T> {
public int compareTo(T o);
}
Eine Schnittstelle Comparable
wird durch den Typ des Objekts parametrisiert, das sie als Parameter für die Methode akzeptiert compareTo
. In diesem Fall warnen wir den Compiler, welche Objekttypen wir vergleichen werden. Wenn die Typidentitätsbedingung nicht erfüllt ist, erhalten wir eine Fehlermeldung ClassCastException
. Eine Methode compareTo
in Java vergleicht das aufrufende Objekt mit dem als Parameter übergebenen Objekt und gibt als Ergebnis des Vergleichs eine Ganzzahl zurück:
- positiv, wenn das aufrufende Objekt größer ist als das als Parameter übergebene Objekt;
- negativ, wenn das aufrufende Objekt kleiner ist als das als Parameter übergebene Objekt;
- null, wenn die Objekte gleich sind.
Warum wird in Java die Methode „compareTo“ benötigt?
Ein Java-Programmierer hat sehr oft mit Arrays und Objektlisten zu tun. Wenn Sie mit großen Datenmengen arbeiten, ist es oft praktisch, diese in organisierter oder sortierter Form zu speichern. Erstens beschleunigt es die Arbeit mit der Sammlung bei der Suche nach den notwendigen Informationen und zweitens werden organisierte Daten visuell besser wahrgenommen.sort()
Klassenmethode Arrays
, und eine Sammlung von Objekten in Form einer Liste ist eine ähnliche Klassenmethode Collections
. Um mit diesen Methoden zu sortieren, haben uns die Java-Entwickler die Freiheit gegeben, die Sortierkriterien festzulegen: durch die Implementierung der Schnittstelle Comparable
in der Klasse der Objekte, die wir sortieren möchten, oder durch die Verwendung von Comparator
. Im ersten Fall akzeptieren Sortiermethoden eine Reihe von Objekten in Form eines Arrays oder einer Liste:
sort(T[]array)//Sortierung массива
sort(List<T> list)// Sortierung списка
und im zweiten - plus eine weitere Implementierung der Schnittstelle Comparator
:
sort(T[]array, Comparator <? super T> comparator)//Sortierung массива
sort(List<T> list, Comparator <? super T> comparator)// Sortierung списка
Die Schnittstelle Comparable
wird verwendet, wenn wir beim Sortieren eine natürliche (aus unserer Sicht logischste) Reihenfolge von Objekten festlegen möchten. Es ist auch eine Möglichkeit, den Algorithmus zum Vergleichen von Objekten dieser Klasse in der Entwurfsphase „fest zu verdrahten“. Mithilfe der Implementierung dieser Schnittstelle werden beispielsweise die Kriterien für die natürliche Reihenfolge in den Wrapper-Klassen der wichtigsten primitiven Typen definiert: , , Byte
, Character
, Long
, Integer
, Short
, Double
, Float
. Das bedeutet auch, dass diese Klassen über eine implementierte Methode verfügen , die wir bei Bedarf im Programm verwenden können. Schauen wir uns ein Beispiel für einen String-Vergleich an , um zu sehen, wie diese Methode in der Klasse implementiert wird . Boolean
String
compareTo
String
String str1="Аарон";
String str2="АAPOH";
String str3="аарон";
String str4="ААрон";
String str5="аАрон";
String str6="Берта";
String str7="берта";
String[] allStr=new String[]{str1,str2,str3,str4, str5,str6, str7};
Arrays.sort(allStr);
for (String s:allStr){
System.out.println(s);
}
}
Wenn wir diesen Code in der Methode ausführen main
, erhalten wir folgendes Ergebnis:
АAPOH
ААрон
Аарон
Берта
аАрон
аарон
берта
Wie Sie im Beispiel in der Klasse sehen können String
, ordnet die Methode compareTo
Zeichenfolgen alphabetisch, lexikografisch und unter Berücksichtigung der Groß-/Kleinschreibung an. Es ist diese Reihenfolge des String-Vergleichs, die von den Entwicklern der Klasse String
als natürlich definiert wird. Für ein einfacheres Verständnis der lexikografischen Reihenfolge reicht es aus, sich daran zu erinnern, wie Wörter in Sprachwörterbüchern angeordnet sind. Beim Zahlenvergleich werden die Objekte in aufsteigender Reihenfolge geordnet. Diese Vergleichslogik ist in die Klassen , Byte
, Character
, Long
, Integer
, Shor
eingebettet . Double
Float
Lassen Sie uns den Vergleich in unserer Klasse implementieren
Schauen wir uns ein Beispiel an, wie Sie die Fähigkeit zum Vergleichen von Objekten in Ihre Klasse integrieren können. Bei der Implementierung einercompareto
Java-Methode können wir ein oder mehrere Kriterien zum Ordnen von Objekten angeben und auch Methoden compareto
aus den Klassen String
und verwenden Integer
. Beispielsweise User
legen wir für Klassenobjekte die Sortierung nach Namen und bei gleichen Namen nach Alter fest. Objekte werden in ihrer natürlichen Reihenfolge angeordnet (mit steigendem Wert). Klasse User
:
public class User implements Comparable <User>{//добавляем возможность сравнивать ein Objektы User
private String name;
private Integer age;
private String email;
public User(String name, int age, String email) {
this.name = name;
this.age = age;
this.email = email;
}
@Override
//реализуем метод compareTo интерфейса Comparable
public int compareTo(User o) {
//используем метод compareTo из класса String для сравнения имен
int result = this.name.compareTo(o.name);
//если имена одинаковые - сравниваем возраст,
используя метод compareTo из класса Integer
if (result == 0) {
result = this.age.compareTo(o.age);
}
return result;
}
@Override
public String toString() {
return "{" +
"name='" + name + '\'' +
", age=" + age +
", email='" + email + '\'' +
'}';
}
Testen wir die Funktionsweise der compareTo
in der Klasse implementierten Methode User
mithilfe der sort
Klassenmethode Collections
:
public static void main(String[] args) {
User user = new User(„Andrei“, 19, "andryha@mail.ru");
User user2 = new User("Олег", 25, "oleg@mail.ru");
User user3 = new User(„Andrei“, 24,"opr@google.com");
User user4 = new User(„Igor“, 16, "igor@mail.ru");
User user5 = new User(„Andrei“, 44,"stary@google.com");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user2);
list.add(user3);
list.add(user4);
list.add(user5);
System.out.println("-------до сортировки--------");
for (User u : list) {
System.out.println(u);
}
System.out.println("-------после сортировки-----");
Collections.sort(list);
for (User u : list) {
System.out.println(u);
}
}
}
}
Ergebnis der Methode main
:
-------до сортировки--------
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Андрей', age=44, email='stary@google.com'}
-------после сортировки-----
{name='Андрей', age=19, email='andryha@mail.ru'}
{name='Андрей', age=24, email='opr@google.com'}
{name='Андрей', age=44, email='stary@google.com'}
{name='Игорь', age=16, email='igor@mail.ru'}
{name='Олег', age=25, email='oleg@mail.ru'}
Fassen wir also zusammen. Wenn Sie ein Anhänger der Ordnung in allem sind und Ihre Objekte ohne unnötigen Code in einem Array oder einer Liste anordnen möchten, verwenden Sie die Schnittstelle Comparable
. Durch die Implementierung der Methode „compareTo“ können Sie ganz einfach einen Mechanismus zum natürlichen Ordnen von Objekten in Ihrer Klasse einbauen. Wenn Sie mit Sammlungen und Arrays von Objekten der in der Java-Bibliothek beschriebenen Standardklassen arbeiten müssen, verwenden Sie vorgefertigte Implementierungen compareTo
in diesen Klassen.
GO TO FULL VERSION