从Scala中的ArrayBuffer [String]元素的排列创建一个字符串

时间:2017-02-28 10:37:34

标签: string scala permutation 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,创建另一个字符串,然后与此连接,但它可以生成&#34;在这里 - 以某种方式在同一个字符串内?

感谢。

1 个答案:

答案 0 :(得分:1)

从你的例子看来,你需要的是组合,而不是排列。

因此,要为y中的每对元素设置一个术语,您可以使用combinations方法找到长度为2的所有组合。然后你可以用必要的格式将每一对括在括号中,最后用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(" & ")}"