JavaRush /Java-Blog /Random-DE /CompareTo-Methode

CompareTo-Methode

Veröffentlicht in der Gruppe Random-DE
Um in einem Array oder einer Sammlung gespeicherte Objekte desselben Typs zu organisieren, haben Java-Entwickler die Comparable. Es deklariert nur eine Methode compareTo:
public interface Comparable<T> {
    public int compareTo(T o);
}
CompareTo-Methode – 1Eine Schnittstelle Comparablewird 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 compareToin 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.
Das Schreiben der Objektvergleichslogik ist die alleinige Aufgabe des Klassenentwicklers und wird durch die gewünschten Ergebnisse der Reihenfolge bestimmt.

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.
CompareTo-Methode – 2
Eine der einfachsten und effektivsten Möglichkeiten, ein Array von Objekten zu sortieren, ist die 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 Comparablein 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 Comparablewird 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 . BooleanStringcompareToString
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 compareToZeichenfolgen alphabetisch, lexikografisch und unter Berücksichtigung der Groß-/Kleinschreibung an. Es ist diese Reihenfolge des String-Vergleichs, die von den Entwicklern der Klasse Stringals 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, Shoreingebettet . DoubleFloat

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 einer comparetoJava-Methode können wir ein oder mehrere Kriterien zum Ordnen von Objekten angeben und auch Methoden comparetoaus den Klassen Stringund verwenden Integer. Beispielsweise Userlegen 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 compareToin der Klasse implementierten Methode Usermithilfe der sortKlassenmethode 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 compareToin diesen Klassen.
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION