2017-02-28 126 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