J'ai un simple morceau de code Scala. Je boucle séquentiellement à travers une liste de chaînes, et je veux compter l'occurrence de chaque chaîne que je recueille comme tuples (String, Int) dans la liste r. La partie dans la fonction principale doit rester (donc pas groupBy
ou quelque chose). Ma question concerne la fonction de mise à jour:Puis-je compter l'occurrence dans 1 boucle dans ce fragment Scala?
maintenant, je fais d'abord un find
, puis j'ajoute un nouveau tuple à r s'il n'existe pas. Si elle existe, je fais une boucle sur r et met à jour le compteur pour la chaîne correspondante.
la fonction de mise à jour peut être modifiée de sorte qu'il est plus efficace? Peut-on mettre à jour en une seule itération (en ajoutant s'il n'existe pas, en mettant à jour le compteur s'il existe)?
Merci
var r = List[(String, Int)]() // (string, count)
def update(s: String, l: List[(String, Int)]) : List[(String, Int)] = {
if (r.find(a => a._1 == s) == None) {
(s, 1) :: r // add a new item if it does not exist
} else {
for (b <- l) yield {
if (b._1 == s) {
(b._1, b._2 + 1) // update counter if exists
} else {
b // just yield if no match
}
}
}
}
def main(args : Array[String]) : Unit = {
val l = "A" :: "B" :: "A" :: "C" :: "A" :: "B" :: Nil
for (s <- l) r = update(s, r)
r foreach println
}
Je ne comprends pas exactement ce que votre objection à 'groupBy' est. Il semble dire que le code de la définition 'main' ne peut pas être changé par la solution; Cela pourrait aussi signifier que «l» ne peut pas être changé. Alors, pourriez-vous clarifier s'il vous plaît? –
principalement parce que je veux aussi travailler avec des collections paresseuses. Ou pouvez-vous également utiliser 'groupBy' pour les collections paresseuses et' Streams' (ou 'Source.getLines')? Si oui, donnez-moi un exemple. –