Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java

Einführung

Ich habe versucht, eine schnelle Sortierung mit Lambda-Ausdruck und Stream in Java zu implementieren. Die Zielgruppe für diesen Artikel ist:

Lambda-Ausdruck

Der Lambda-Ausdruck kann in der Form (Argument) -> Rückgabewert geschrieben werden, und die Funktion kann mit der Methode apply aufgerufen werden.

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> addHoge = (final String str) -> str + "hoge";
        System.out.println(addHoge.apply("fuga"));
    }
}

Wenn Sie mehrere Ausdrücke schreiben möchten, können Sie auch Blöcke verwenden.

import java.util.function.Function;

public class Main {
    public static void main(String[] args) {
        Function<String, String> addHoge = (final String str) -> {
            String hoge = "hoge";
            return str + hoge;
        };
        System.out.println(addHoge.apply("fuga"));
    }
}

Stream Stream ist eine Klasse, die Operationen vom Funktionstyp für die Elemente einer Sammlung unterstützt. Stream kann durch Aufrufen der Methode "stream ()" der Auflistungsklasse verwendet werden.

Wenn Sie ein Programm schreiben, das mit stream () ein Vielfaches von 2 anzeigt, ist dies wie folgt.

Java


Arrays.asList(3, 21, 34, 0).stream().filter(n -> n % 2 == 0).forEach(System.out::println);

Mit Scala sieht es so aus: Im Vergleich zu Java ist der Code einfacher, da Sie nicht "stream ()" schreiben müssen.

Scala


List(3, 21,34, 0).filter(_ % 2 == 0).foreach(println)

Quellcode (Scala)

Bevor Sie die schnelle Sortierung in Java implementieren, finden Sie hier den in Scala implementierten Code. Die schnelle Sortierung "Pivot" wird am Anfang des Arrays angegeben.

object Main extends App {
    println(quickSort(List(3, 21, 34, 0, -30, 55, 10)))
    
    def quickSort(nums: List[Int]): List[Int] = {
      nums.headOption.fold(List[Int]()){ pivot =>
        val left = nums.filter(_ < pivot)
        val right = nums.filter(pivot < _)
        quickSort(left) ++ List(pivot) ++ quickSort(right)
      }
    }
}

Quellcode (Java)

Das Folgende ist eine Implementierung der schnellen Sortierung in Java.

Im Vergleich zu Scalas Code bin ich von der Menge an Java-Code überwältigt, aber ich denke, die Logik selbst hat fast die gleiche Implementierung.

Der einzige Unterschied in der Logik ist die Fold-Methode. Es gibt Stellen, an denen die Falzmethode im Scala-Code verwendet wird, aber die Falzmethode ist im optionalen Java-Typ (Optionstyp in Scala) nicht vorhanden. Stattdessen werden die Map-Methode und die OrElseGet-Methode (getOrElse-Methode in Scala) in Kombination verwendet.

import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import static java.util.stream.Collectors.toList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        final List<Integer> nums = Arrays.asList(3, 21, 34, 0, -30, 55, 10);
        final List<Integer> sorted = quickSort(nums);
        System.out.println(sorted.toString());
    }

    private static List<Integer> quickSort(final List<Integer> nums) {
        return nums.stream().findFirst().map((final Integer pivot) -> {
            final List<Integer> left = nums.stream().filter(n -> n < pivot).collect(toList());
            final List<Integer> middle = Collections.singletonList(pivot);
            final List<Integer> right = nums.stream().filter(n -> pivot < n).collect(toList());
            return Stream.of(quickSort(left), middle, quickSort(right)).flatMap(Collection::stream).collect(toList());
        }).orElseGet(Collections::emptyList);
    }
}

Recommended Posts

Implementieren Sie eine funktionsähnliche schnelle Sortierung in Java
Probieren Sie den Funktionstyp in Java aus! ①
Implementierung der zweistufigen Authentifizierung in Java
Implementieren Sie die Standardauthentifizierung in Java
Implementieren Sie eine Kombination aus Mathematik in Java
2 Implementieren Sie eine einfache Syntaxanalyse in Java
Implementieren Sie das Senden von E-Mails in Java
Implementieren Sie rm -rf in Java.
Implementieren Sie die XML-Signatur in Java
3 Implementieren Sie einen einfachen Interpreter in Java
Implementieren Sie reCAPTCHA v3 in Java / Spring
Implementieren Sie die PHP-Implodierungsfunktion in Java
Versuchen Sie, Yuma in Java zu implementieren
1 Implementieren Sie eine einfache Phrasenanalyse in Java
So implementieren Sie die Datumsberechnung in Java
So implementieren Sie den Kalman-Filter mit Java
Implementieren Sie API Gateway Lambda Authorizer in Java Lambda
Partisierung in Java
Versuchen Sie, n-ary Addition in Java zu implementieren
Änderungen in Java 11
Janken in Java
So erzwingen Sie Codierungskonventionen in Java
[Java] Funktionsschnittstelle
Implementieren Sie so etwas wie einen Stack in Java
Umfangsrate in Java
FizzBuzz in Java
Informationen zur Java-Funktionsschnittstelle
Lesen Sie JSON in Java
Interpreter-Implementierung durch Java
Machen Sie einen Blackjack mit Java
Janken App in Java
NVL-artiger Typ in Java
Verbinden Sie Arrays in Java
"Hallo Welt" in Java
Aufrufbare Schnittstelle in Java
Kommentare in der Java-Quelle
Azure funktioniert in Java
Formatieren Sie XML in Java
Boyer-Moore-Implementierung in Java
Hallo Welt in Java
Verwenden Sie OpenCV mit Java
WebApi-Memorandum mit Java
Typbestimmung in Java
Befehle in Java ausführen (Ping)
Verschiedene Threads in Java
Implementierung der Heap-Sortierung (in Java)
Zabbix API in Java
ASCII-Kunst in Java
Listen in Java vergleichen
POST JSON in Java
Fehler in Java ausdrücken
Implementieren Sie CustomView im Code
Erstellen Sie JSON in Java
Datumsmanipulation in Java 8
Was ist neu in Java 8?
Verwenden Sie PreparedStatement in Java
Was ist neu in Java 9,10,11
Parallele Ausführung in Java