[Java8] Angemessene Verwendung von Compareable und Comparator unter dem Gesichtspunkt der Mitarbeitersortierung

Vorstellen

Schön, Sie kennenzulernen. Mein Name ist @ekuro und ich mache einen Arbeitsverwaltungsdienst namens Gozal. Bei Gozal führen wir eine domänengesteuerte Entwicklung durch, um das Arbeitsmanagement besser in die Software zu integrieren. Wir sind ständig auf der Suche nach besseren und vielseitigeren Klassen, damit wir leicht auf Änderungen in Geschäftsprozessen aufgrund von Reformen des Arbeitsstils reagieren können.

Dieses Thema

Dieses Mal dachte ich darüber nach, was ich verwenden und wo ich definieren soll, um die Liste der Mitarbeiter nach der Mitarbeiternummer zu sortieren.

Was ich getan habe

Annahme

Betrachten Sie den Prozess des Sortierens der Liste der Mitarbeiter "Liste Mitarbeiter" nach Mitarbeiternummer.

Employee.java


@Getter
@AllArgsConstructor
public class Employee {
  //Mitarbeiternummer
  private EmployeeNumber number;
  //Persönliche Informationen wie Name und Geburtsdatum
  private Personal personal;
}

@Getter
@AllArgsConstructor
public class EmployeeNumber {
  private String number;
}

Sortiermethode

Typische Methoden zum Sortieren von Objekten in Java 8 sind Collections.sort und die Sorted-Methode der Stream-API.

Wenn Sie Sammlungen verwenden, müssen Sie eine der beiden folgenden Arten von Sortiermethoden verwenden.

public static <T extends Comparable<? super T>> void sort(List<T> list) {
  list.sort(null);
}
public static <T> void sort(List<T> list, Comparator<? super T> c) {
  list.sort(c);
}

Bei Verwendung der Stream-API stehen außerdem zwei Arten von Methoden zur Verfügung.

Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);

In beiden Fällen muss bei Verwendung der ersten Methode die zu sortierende Klasse Compareable implementieren, und bei Verwendung der zweiten Methode wird der Funktionsschnittstellenkomparator als Argument verwendet. Muss übergeben werden.

Sowohl Comparable als auch Comparator sind Klassen, die Größenvergleiche definieren. Schauen wir uns jedoch zunächst die Unterschiede an.

Unterschied zwischen Vergleichbar und Komparator

Comparable ist eine Schnittstelle, in der nur "public int compareTo (To);" definiert ist. Durch Erben von Compareable mit dem Objekt, das Sie vergleichen möchten, und Implementieren von compareTo können Sie definieren, wie dieses Objekt verglichen werden soll. Die compareTo-Methode vergleicht sich mit dem Argument. Andererseits definiert die Comparator-Schnittstelle eine Methode mit zwei Argumenten: "int compare (To1, To2);". Da Sie für die zu vergleichenden Objekte mehrere Komparatoren implementieren können, ist dies hilfreich, wenn Sie die Sortierung nach verschiedenen Schlüsseln definieren möchten.

Für Mitarbeiter

Betrachten Sie den Fall der Employee-Klasse. Die Mitarbeiterklasse enthält neben der Mitarbeiternummer auch persönliche Informationen wie den Namen. Daher ist es in Zukunft möglich, nach verschiedenen Informationen zu sortieren. Daher ist es besser, für jedes zu vergleichende Element einen Vergleicher zu erstellen, als Compareable in der Employee-Klasse zu erben.

Schreiben wir eine Methode, die tatsächlich einen Composer zurückgibt, um die Mitarbeiterliste nach Mitarbeiternummer zu sortieren. [^ 1]

Employee.java


@Getter
@AllArgsConstructor
public class Employee {
  //Mitarbeiternummer
  private EmployeeNumber number;
  //Persönliche Informationen wie Name und Geburtsdatum
  private Personal personal;

  public static Comparator<Employee> orderByNumber() {
    return Comparator.comparing(
      //Einfacher Vergleich von Mitarbeiternummernzeichenfolgen
      (Employee employee) -> employee.getNumber().getNumber());
  }
}

Wenn Sie tatsächlich sortieren

List<Employee> employees = ~;
Collections.sort(employees, Employee.orderByNumber());

Kann geschrieben werden.

Führen Sie die Vergleichsverarbeitung an der entsprechenden Stelle durch

Im obigen Beispiel ist die Vergleichsmethode "orderByNumber ()" in der Employee-Klasse definiert. Der Vergleich von Mitarbeiternummern ist jedoch von Natur aus eine Eigenschaft, die Mitarbeiternummernklassen haben sollten. Verschieben Sie die Vergleichsmethode in die EmployeeNumber-Klasse.

Employee.java


@Getter
@AllArgsConstructor
public class Employee {
  //Mitarbeiternummer
  private EmployeeNumber number;
  //Persönliche Informationen wie Name und Geburtsdatum
  private Personal personal;

  public static Comparator<Employee> orderByNumber() {
    //Mit EmployeeNumber als Vergleichsschlüssel wird der Sortiervorgang der Bestellmethode EmployeeNumber überlassen.
    return Comparator.comparing(Employee::getNumber, EmployeeNumber.order());
  }
}

EmployeeNumber.java


@Getter
@AllArgsConstructor
public class EmployeeNumber {
  private String number;
  
  public static Comparator<EmployeeNumber> order() {
    return Comparator.comparing(EmployeeNumber::getNumber);
  }
}

Die Vergleichsverarbeitungsmethode wurde mit EmployeeNumber abgeschlossen, wodurch sie zu einer vielseitigeren Klasse wurde. Diesmal ist der Größenvergleichsprozess von EmployeeNumber eine einfache Logik. Wenn jedoch Zahlen und Zeichenfolgen gemischt werden, wird dies zu einem etwas komplizierten Prozess. In diesem Fall ist es besser, einen Vergleichsprozess in EmployeeNumber zu definieren.

Überlegen Sie noch einmal, ob Sie Comparable verwenden können

Da für ein Objekt mehrere Komparatoren definiert werden können, ist es einfach, sie häufig zu verwenden. Überprüfen Sie also, ob Sie Comparer verwendet haben, wo Sie Comparable erben sollten.

Es scheint, dass die Sortierung der Mitarbeiternummer dieses Mal in Zukunft nicht mehr nach der Nummer sortiert wird. Daher ist es besser, Comparable für die Verarbeitung des Vergleichs von Mitarbeiternummern zu verwenden.

Employee.java


@Getter
@AllArgsConstructor
public class Employee {
  //Mitarbeiternummer
  private EmployeeNumber number;
  //Persönliche Informationen wie Name und Geburtsdatum
  private Personal personal;

  public static Comparator<Employee> orderByNumber() {
    //EmployeeNumber implementiert Comparable, wodurch die Anzahl der Argumente reduziert wird.
    return Comparator.comparing(Employee::getNumber);
  }
}

EmployeeNumber.java


@Getter
@AllArgsConstructor
public class EmployeeNumber implements Comparable<EmployeeNumber> {
  private String number;
  
  @Override
  public int compareTo(@Nonnull EmployeeNumber other) {
    return this.number.compareTo(other.number);
  }
}

Durch das Erben von Comparable von EmployeeNumber wird eine unnötige Beschreibung vermieden und der Verarbeitungsinhalt verfeinert.

Wenn Sie die entsprechende Verarbeitung auf diese Weise an die entsprechende Stelle schreiben, können Sie in Zukunft problemlos auf Anfragen wie "Ich möchte nach Namen sortieren" und "Ich möchte nach Geburtstag sortieren" reagieren.

Wir glauben, dass ein besseres Verständnis von Konzepten und das Entwerfen von Klassen nicht nur die Implementierung und Bereitstellung von leicht verständlichem Quellcode erleichtert, sondern auch zur Entdeckung komplexerer neuer Geschäftsabläufe führt.

Bei Gozal werden wir uns daran halten, das Konzept zu verstehen, um eine neue Arbeitserfahrung zu schaffen, die die Welt durch die Entsendung von Ingenieuren atemberaubend macht.

Rekrutierung von Ingenieuren aus der Welt des Arbeitsmanagements, um unnötige Handarbeit zu vermeiden! Rekrutierung von Frontingenieuren zur Schaffung eines SaaS!

[^ 1]: Die in der Comparator-Schnittstelle bereitgestellte statische Vergleichsmethode verwendet Function als Argument und vergleicht das Ergebnis von Function mit compareTo, wenn nur ein Argument vorhanden ist.

Recommended Posts

[Java8] Angemessene Verwendung von Compareable und Comparator unter dem Gesichtspunkt der Mitarbeitersortierung
Verwendung von Abstract Class und Interface in Java richtig
Verwenden Sie redirect_to und rendern Sie richtig
Ordnungsgemäße Verwendung von Mockito und PowerMock
Gibt an, ob Java Comparable oder Comparator verwendet werden soll
Richtige Verwendung der Schnittstelle und der abstrakten Klasse
Diskriminierung von Enum in Java 7 und höher
(In 1 Minute bestimmen) Wie verwende ich leer ?, Leer? Und präsent?
[Java] Verwendung von final in der lokalen Variablendeklaration
Kriterien für die ordnungsgemäße Verwendung von render und redirect_to
Sortieren mit Java-Komparator
Verwendung japanischer Schriftarten und Fremdzeichen in Jasper Report
Verwenden Sie OpenCV mit Java
Verwenden Sie PreparedStatement in Java
Umgang mit Datum und Uhrzeit in Ruby. Verwenden Sie Datum und Uhrzeit richtig.
[Für Anfänger] Erläuterung von Klassen, Instanzen und Statik in Java
Aufrufen und Verwenden der API in Java (Spring Boot)
Gründe, Servlet und JSP in der Java-Entwicklung getrennt zu verwenden
[Java] Komparator der Collection-Klasse
Vergleichbar und Komparator (Objekte bestellen)
Vor- und Nachteile von Java
Java-Implementierung von Tri-Tree
[Java] Grundbegriffe der Programmierung
Mechanismus und Merkmale der in Java häufig verwendeten Collection-Implementierungsklasse
Verwenden Sie Java mit MSYS und Cygwin
Über Biocontainer fastqc und Java
Beispiel für Codierung und Decodierung in Java
Verwenden wir Twilio in Java! (Einführung)
Verwenden Sie JDBC mit Java und Scala.
[Java] Verwenden Sie nicht "+" im Anhang!
Verwenden Sie zusammengesetzte Schlüssel in Java Maps.
StringBuffer- und StringBuilder-Klasse in Java
Liste der in Java 9 hinzugefügten Mitglieder
Verstehe gleich und hashCode in Java
Wie verwende ich Klassen in Java?
Liste der in Java 9 hinzugefügten Typen
Implementierung einer ähnlichen Funktion in Java
Verwenden Sie Stream in Java?
Hallo Welt in Java und Gradle
JSON in Java und Jackson Teil ③ Betten Sie JSON in HTML ein und verwenden Sie es aus JavaScript
Die Geschichte, zu vergessen, eine Datei in Java zu schließen und zu scheitern
Verwenden Sie den statischen Initialisierungsblock, um die Liste / den Satz statischer Felder in Java zu initialisieren
AtCoder ABC 111 C Hash-Sortierung In Ruby, Perl und Java gelöst
Was war keine faire Verwendung der Java-API-Umleitung unter Android?
Dies und das der Implementierung der zeitlichen Beurteilung von Daten in Java
Vergleich der Thread-Implementierungsmethoden in Java und der Lambda-Ausdrucksmethode
[Java] Beachten Sie, wie Sie RecyclerView verwenden und die animierte Swipe-Verarbeitung implementieren.
Finden Sie das Maximum und Minimum der fünf in Java eingegebenen Zahlen
Überprüfung von "seltsamem Java" und Java-Wissen, das in Java Bronze oft vergessen wird