Supposons que je besoin d'une fonction pour filtrer les caractères de chars
d'une chaîne str
puis ne prendre que k
premiers caractères du résultat:Comment traiter paresseusement deux chaînes à la fois?
def cleanTrim(str: String, chars: Set[Char], k: Int): String =
str.filterNot(chars).take(k)
Cette mise en œuvre est sous-optimale car il scanne inutilement la chaîne entière. Afin d'optimiser l'on peut utiliser view
ou d'un événement Stream
pour scanner l'entrée paresseusement, par exemple:
def cleanTrim(str: String, chars: Set[Char], k: Int): String =
str.view.foldLeft("") { case (r, c) => if (chars.contains(c)) r + c else r }.take(k)
Supposons maintenant que je dois nettoyer et dégraisser paresseusement deux cordes. Je voudrais les traiter paresseusement pour traiter un seul personnage à la fois et retourner les deux résultats.
def cleanTrim2(str1: String,
str2: String,
chars: Set[Char],
k: Int): (String, String) = ???
Comment pourriez-vous le mettre en œuvre?
Vous prenez en deux chaînes, filtre eux et renvoyer une seule chaîne? Lequel retournez-vous? –
Mon erreur. Je dois retourner les deux. Mise à jour de la question – Michael
Pourquoi ne pas prendre une séquence, la replier et la renvoyer? –