2017-02-28 2 views
0

JeCréation d'une chaîne à partir des permutations d'un des éléments ArrayBuffer [chaîne] Scala

val a: String = "E" 
val y: ArrayBuffer[String] = new ArrayBuffer("I", "G", "S") 

Je suis en train de faire une chaîne, telle que:

"(E <=> (I | G | S)) & (~I | ~G) & (~I | ~S) & (~G | ~S)" 

Actuellement, pour la première une partie de chaîne (premier paragraphe) (E <=> (I | G | S)), j'ai ce qui est fonctionnel:

s"($a <=> (${y.mkString(" | ")}))" // & (~${y.mkString(" | ~")})" 

Pour la deuxième partie , où sont les permutations d'éléments dans y, c'est-à-dire, pour (~I | ~G) & (~I | ~S) & (~G | ~S), comment je peux améliorer (réparer) la pièce dans les commentaires pour la créer? J'essaie d'utiliser le y.permutations, pour créer une autre chaîne, puis concaténer avec celle-ci, mais peut-elle être "générée" ici - dans la même chaîne d'une certaine façon?

Merci.

Répondre

1

Il semble, d'après votre exemple, que vous ayez besoin de combinaisons et non de permutations.

Pour avoir un terme pour chaque paire d'éléments de y vous pouvez trouver toutes les combinaisons de longueur 2 en utilisant la méthode combinations. Ensuite, vous pouvez envelopper chaque paire entre crochets dans le format nécessaire, et enfin construire toute la deuxième partie avec mkString:

y.combinations(2).map { case Seq(a, b) => s"(~$a | ~$b)" }.mkString(" & ") 

Vous pouvez intégrer cette expression dans l'interpolation de chaîne:

s"($a <=> (${y.mkString(" | ")})) & ${ 
    y.combinations(2).map { case Seq(a, b) => s"(~$a | ~$b)" }.mkString(" & ")}" 
+0

Oui, c'est exactement le résultat que j'essaie d'atteindre. J'étais loin d'essayer de cette façon: /. Merci beaucoup - je le pense vraiment! – user4712458