【发布时间】:2012-01-03 07:16:44
【问题描述】:
给定一个数字与多个字符相关联的地图
scala> val conversion = Map("0" -> List("A", "B"), "1" -> List("C", "D"))
conversion: scala.collection.immutable.Map[java.lang.String,List[java.lang.String]] =
Map(0 -> List(A, B), 1 -> List(C, D))
我想根据数字序列生成所有可能的字符序列。例子:
"00" -> List("AA", "AB", "BA", "BB")
"01" -> List("AC", "AD", "BC", "BD")
我可以通过理解来做到这一点
scala> val number = "011"
number: java.lang.String = 011
为每个索引创建一系列可能的字符
scala> val values = number map { case c => conversion(c.toString) }
values: scala.collection.immutable.IndexedSeq[List[java.lang.String]] =
Vector(List(A, B), List(C, D), List(C, D))
生成所有可能的字符序列
scala> for {
| a <- values(0)
| b <- values(1)
| c <- values(2)
| } yield a+b+c
res13: List[java.lang.String] = List(ACC, ACD, ADC, ADD, BCC, BCD, BDC, BDD)
这里的事情变得丑陋,它只适用于三位数的序列。有什么方法可以对任何序列长度达到相同的结果?
【问题讨论】:
-
严格来说,你想要得到的不是笛卡尔积。如果你有
List[T],你不保证大小,而且列表应该是同质的。