2017-02-28 124 views
0

創建從ArrayBuffer [字符串]元素的排列中的字符串斯卡拉

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

我試圖做一個字符串,使得:

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

目前,第字符串的一部分(第一條)(E <=> (I | G | S)),我有此其功能:

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

對於第二部分,y中的元素排列在哪裏,即(~I | ~G) & (~I | ~S) & (~G | ~S),我如何改進(修復)評論中的部分以創建它?

我想用y.permutations來創建另一個字符串,然後與這個字符串連接,但是可以在這裏「生成」 - 在某種方式下在同一個字符串中?

謝謝。

回答

1

從你的例子看來,你需要的是組合,而不是排列。

所以要從y的每對元素有一個術語,你可以找到長度爲2的所有組合使用combinations方法。然後,你可以用在必要的格式架,每一個對,最終構建整個第二部分與mkString

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

可以將此表達融入字符串插值:

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

是的,這正是我試圖達到的結果。我用這種方式遠遠不夠:/。非常感謝你 - 我的意思是! – user4712458