[Java] Schreiben Sie ein Programmierquiz SET INTERSECTION mit StreamAPI in eine Zeile

Als Ergebnis eines Programmierquiz bei der Arbeit erhielten zwei Personen die gleiche Antwort

Was ist SET INTERSECTION?

Ein Programmierquiz wie FizzBuzz. Dieses Mal werden wir die in CodeEval aufgeführten Probleme herausfordern.

CodeEval - https://www.codeeval.com/browse/30/

Problem (freie Übersetzung)

Der Eingabewert ist eine Liste von zwei Arten sortierter Zahlen (in aufsteigender Reihenfolge). Die Liste wird durch ";" getrennt, und die Zahlen in der Liste werden durch "," getrennt. Gibt doppelte Zahlen in zwei Arten von Listen aus, die durch "," getrennt sind.

Eingabewertprobe


1,2,3,4;4,5,6

20,21,22;45,46,47

7,8,9;8,9,10,11,12

Ausgabewertprobe


4

(Keine Leistung)

8,9

Ein solches Bild


java SetIntersection "1,2,3,4;4,5,6"

Antwort: Ich habe es in einer Zeile geschrieben (verspielt)

Es ist in vielerlei Hinsicht ein Einzeiler geworden. (Modularisierung oder Ausnahmebehandlung werden nicht berücksichtigt.)

import java.util.Arrays;
import java.util.stream.Collectors;

public class SetIntersection {
  public static void main(String[] args) {

    System.out.println(String.join(",",
        Arrays.stream(args[0].split(";")[0].split(","))
            .filter(leftString -> Arrays.stream(args[0].split(";")[1].split(",")).anyMatch(leftString::equals))
            .collect(Collectors.toList())));

  }
}

Antwort: Zur besseren Lesbarkeit zerlegt

Verwenden Sie "Filter", um nur diejenigen einzugrenzen und aufzulisten, die die Bedingungen von "anyMatch" erfüllen. Der Rest ist die Ausgabe mit "String.join", getrennt durch Kommas.

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class SetIntersection {

  private static final String SEPARATOR_LIST = ";";
  private static final String SEPARATOR_NUMBER = ",";

  public static void main(String[] args) {

    Stream<String> leftSide = Arrays.stream(args[0].split(SEPARATOR_LIST)[0].split(SEPARATOR_NUMBER));
    List<String> rightSide = Arrays.asList(args[0].split(SEPARATOR_LIST)[1].split(SEPARATOR_NUMBER));

    System.out.println(String.join(SEPARATOR_NUMBER,
                                   leftSide.filter(leftString -> rightSide.stream().anyMatch(leftString::equals))
                                           .collect(Collectors.toList())));

  }
}

Die Antwort bei der Arbeit wurde in die Methode mit "for" und "if" und die Methode mit "stream" unterteilt. Ersteres ist natürlich schneller als Ersteres.

Recommended Posts

[Java] Schreiben Sie ein Programmierquiz SET INTERSECTION mit StreamAPI in eine Zeile
So erhöhen Sie den Wert von Map in einer Zeile in Java
[Java] Stellen Sie die Zeit im Browser mit jsoup ein
Der in Java 10 eingeführte Schnittpunkttyp ist erstaunlich (?)
Die Geschichte des Lernens von Java in der ersten Programmierung
Behandeln Sie die Android-Laufzeitberechtigung in einer Zeile
Programmierung mit dem direkten Summentyp in Java (Nachrichten)
Zusammenfassung der Verwendung des im IE festgelegten Proxy-Sets bei der Verbindung mit Java
Schreiben Sie ABNF in Java und geben Sie die E-Mail-Adresse weiter
Einschränkungsprogrammierung in Java
Kapitel 2 Netzwerkprogrammierung von JAVA phttpd Ausnahmesammlung an 3 Stellen
Schreiben Sie Flyway-Rückrufe in Java
Schreiben Sie Java8-ähnlichen Code in Java8
[Java] Grundbegriffe der Programmierung
Verstehen Sie, wie die funktionale Programmierung in Java auf einen Schlag eingeführt wurde
Wie schreibe ich Ruby, wenn in einer Zeile Zusammenfassung vom Anfänger
Korrigieren Sie den Namen der Kriegsdatei auf den in Maven festgelegten
Die in /lib/calendars.properties von Java jre festgelegte Millisekunde ist UTC
[Java] Ich möchte mit dem Schlüssel im Objekt eindeutig arbeiten