Komparator in Java sortieren

Rashmi Patidar 12 Oktober 2023
  1. Verwendung von den DepartmentComparator zum Sortieren von Elementen in Java
  2. Modifizieren Sie das obige Programm mit der Funktion lambda in Java 8
Komparator in Java sortieren

Dieser Artikel definiert, was ein Sortierkomparator in Java ist, und zeigt, wie Sie ihn in Prozessen verwenden können. Wir haben Programme beigefügt, die Sie befolgen können, um Ihnen zu helfen, dieses Konzept besser zu verstehen.

Verwendung von den DepartmentComparator zum Sortieren von Elementen in Java

Sortieren ist der Vorgang, die Datenstrukturen wie ein Liste-Array in einer bestimmten sequentiellen Reihenfolge anzuordnen. Der Prozess funktioniert durch den Vergleich der Datenelemente, wodurch die neuen Positionen definiert werden. In Java sind verschiedene Arten von Sortieralgorithmen definiert, die aufgrund der Komplexität der Struktur nützlich sind.

Unten ist der Codeblock, der das Überschreiben der Komparatorschnittstelle definiert, um unsere Implementierung zum Sortieren der Elemente bereitzustellen.

import java.util.*;

public class DepartmentComparator {
  public static void main(String[] args) {
    List<Department> departments = Arrays.asList(new Department("dept1", 2001),
        new Department("dept2", 1998), new Department("dept3", 2021));
    Collections.sort(departments, new LexicographicComparator());
    System.out.println("Sorting on the basis of name: " + departments);
    Collections.sort(departments, new YearComparator());
    System.out.println("Sorting on the basis of year: " + departments);
  }

  static class LexicographicComparator implements Comparator<Department> {
    @Override
    public int compare(Department a, Department b) {
      return a.name.compareToIgnoreCase(b.name);
    }
  }

  static class YearComparator implements Comparator<Department> {
    @Override
    public int compare(Department a, Department b) {
      return a.establish_year < b.establish_year ? -1
          : a.establish_year == b.establish_year ? 0
                                                 : 1;
    }
  }

  static class Department {
    String name;
    int establish_year;

    Department(String n, int a) {
      name = n;
      establish_year = a;
    }

    @Override
    public String toString() {
      return String.format("{name=%s, Establish Year=%d}", name, establish_year);
    }
  }
}

Im obigen Programm ist die Klasse DepartmentComparator eine öffentliche Klasse, die die Hauptmethode enthält und als Treibercode fungiert. Abgesehen von der Hauptklasse hat der Code nicht öffentliche Klassen, die hinzugefügt wurden, um die Funktionalität zu zeigen. Die Klasse Department ist ein POJO, das einen Feldnamen und die Variable establish_year enthält und die Funktion toString() überschrieben hat. Neben der Bean-Klasse implementieren eine LexicographicComparator-Klasse und eine YearComparator-Klasse das Comparator-Interface.

Bei der statischen Methode wird eine List mit drei Elementen initialisiert. Das Array.asList ist eine statische Methode, die eine List fester Grösse zurückliefert. Die Funktion nimmt Instanzen der Klasse an, um sie in die Liste umzuwandeln. Die Instanz department class wird also mit einem neuen Schlüsselwort erstellt und heisst nun parametrisierter Konstruktor. Dieser Konstruktor initialisiert den Namen und erstellt ein Jahr aus den übergebenen Parametern.

Sobald die Liste erstellt wurde, wird die Methode sort der Klasse Collections aufgerufen. Es sortiert die definierte Liste oder Sammlung basierend auf dem angegebenen Vergleicher. Die Methode verwendet einen manuellen Komparator und gibt void zurück, ändert jedoch die als Argument übergebene Sammlung. Die Methode wirft eine ClassCastException, wenn die Elemente von einem anderen Typ sind. Die Methode verwendet eine Listensammlung als erstes Argument und einen manuellen Komparator als zweites Argument.

Für den manuellen Vergleich werden die Klassen LexicographicComparator und YearComparator erstellt. Die Klassen implementieren eine functional interface, die Comparator ist, mit einer einzigen Methode compare, die basierend auf dem Vergleich einen int-Wert zurückgibt. Die Methode wird in der benutzerdefinierten Klasse überschrieben, in der die benutzerdefinierte Implementierung definiert werden kann.

In der Klasse LexicographicComparator spezifiziert die Methode eine Bedingung basierend auf dem Namen, vergleicht die übergebenen Argumente und gibt -1, 0 oder 1 zurück, je nachdem, ob die Eingabe kleiner, größer oder gleich ist zueinander. Ebenso wird die Methode YearComparator überschrieben, um das als Argument übergebene Jahr zu vergleichen.

Unten ist die Ausgabe nach Namen, in aufsteigender Reihenfolge und nach Jahr geordnet.

Sorting on the basis of name: [{name=dept1, Establish Year=2001}, {name=dept2, Establish Year=1998}, {name=dept3, Establish Year=2021}]
Sorting on the basis of year: [{name=dept2, Establish Year=1998}, {name=dept1, Establish Year=2001}, {name=dept3, Establish Year=2021}]

Modifizieren Sie das obige Programm mit der Funktion lambda in Java 8

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class DepartmentCompareUsingJava8 {
  public static void main(String[] args) {
    List<DepartmentComparator.Department> departments =
        Arrays.asList(new DepartmentComparator.Department("dept1", 2001),
            new DepartmentComparator.Department("dept2", 1998),
            new DepartmentComparator.Department("dept3", 2021));
    Collections.sort(departments, (a, b) -> a.name.compareToIgnoreCase(b.name));
    System.out.println(departments);
    Collections.sort(departments,
        (a, b)
            -> a.establish_year < b.establish_year ? -1
            : a.establish_year == b.establish_year ? 0
                                                   : 1);
    System.out.println(departments);
  }
}

Der Unterschied in diesem Programm besteht darin, dass anstelle der Definition der neuen Klassen, die die Comparator-Schnittstelle implementieren, die Java 8 functional interface dazu beiträgt, den Verarbeitungsaufwand in einer neuen Klasse jedes Mal zu reduzieren. Die Functional Interface hat eine einzelne nicht implementierte Methode oder abstrakte Methode. Es reduziert den Aufwand für das Erstellen einer Klasse, die Schnittstellen implementiert und eine eigene Methodenversion bereitstellt.

Es verwendet Lambda-()->-Funktionen, um die Methode direkt aufzurufen. Lambdas behandeln die Funktionen als Argument und benötigen keine Klasse für die Instanziierung. Die Funktion nimmt Parameter und gibt die Implementierung in derselben Zeile statt in einer separaten Klasse an.

Die Ausgabe des obigen Programms ist die gleiche wie die im ersten Code.

Rashmi Patidar avatar Rashmi Patidar avatar

Rashmi is a professional Software Developer with hands on over varied tech stack. She has been working on Java, Springboot, Microservices, Typescript, MySQL, Graphql and more. She loves to spread knowledge via her writings. She is keen taking up new things and adopt in her career.

LinkedIn

Verwandter Artikel - Java Comparator

Verwandter Artikel - Java Sort