[Java] Rédiger un quiz de programmation SET INTERSECTION avec StreamAPI en une seule ligne

À la suite d'un quiz de programmation au travail, deux personnes ont obtenu la même réponse, alors notez

Qu'est-ce que SET INTERSECTION?

Un quiz de programmation comme FizzBuzz. Cette fois, nous allons contester les problèmes répertoriés dans CodeEval.

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

Problem (traduction gratuite)

La valeur d'entrée est une liste de deux types de nombres triés (par ordre croissant). La liste est séparée par «;» et les nombres de la liste sont séparés par «,». Produit des nombres en double dans deux types de listes, séparés par ,.

Échantillon de valeur d'entrée


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

20,21,22;45,46,47

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

Exemple de valeur de sortie


4

(Aucune sortie)

8,9

Une telle image


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

Réponse: je l'ai écrit en une seule ligne (ludique)

Il est devenu une ligne à bien des égards. (Aucune considération n'est accordée à la modularisation ou au traitement des exceptions)

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())));

  }
}

Réponse: démonté pour plus de lisibilité

Utilisez filter pour affiner et lister uniquement ceux qui remplissent les conditions de ʻanyMatch. Le reste est de sortir avec String.join` séparé par des virgules.

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())));

  }
}

La réponse au travail a été divisée en la méthode utilisant «for» et «if» et la méthode utilisant «stream». Inutile de dire que le premier est plus rapide que le premier.

Recommended Posts

[Java] Rédiger un quiz de programmation SET INTERSECTION avec StreamAPI en une seule ligne
Comment incrémenter la valeur de Map sur une ligne en Java
[Java] Réglez l'heure depuis le navigateur avec jsoup
Le type d'intersection introduit dans Java 10 est incroyable (?)
L'histoire de l'apprentissage de Java dans la première programmation
Traitez avec l'autorisation d'exécution Android en une seule ligne
Programmation utilisant le type de somme directe en Java (news)
Résumé de l'utilisation du jeu de proxy dans IE lors de la connexion avec Java
Écrivez ABNF en Java et transmettez l'adresse e-mail
Programmation par contraintes en Java
Chapitre 2 Programmation réseau par JAVA phttpd Collecte d'exceptions en 3 endroits
Ecrire des rappels de vol en Java
Écrire du code de type Java8 en Java8
[Java] Termes de base en programmation
Comprendre comment la programmation fonctionnelle a été introduite dans Java d'un seul coup
Comment écrire Ruby en une seule ligne Résumé par débutant
Fixez le nom du fichier de guerre à celui défini dans Maven
La milliseconde définie dans /lib/calendars.properties de Java jre est UTC
[Java] Je veux effectuer distinctement avec la clé dans l'objet