我正在编写一个函数,它会在字符串中包含字符出现列表(List[(Char, Int)]
),并生成该出现列表的所有子集。
所以,给定
List(('a', 2), ('b', 2))
它会产生
List(
List(),
List(('a', 1)),
List(('a', 2)),
List(('b', 1)),
List(('a', 1), ('b', 1)),
List(('a', 2), ('b', 1)),
List(('b', 2)),
List(('a', 1), ('b', 2)),
List(('a', 2), ('b', 2))
)
我已经实现了这样:
type Occurrences = List[(Char, Int)]
def combinations(occurrences: Occurrences): List[Occurrences] =
if (occurrences.isEmpty) List(List())
else for {
(c, n) <- occurrences
i <- n to 1 by -1
} yield (c, i) :: combinations(occurrences.tail)
我收到了这个错误:
type mismatch;
found : List[List[Product with Serializable]]
required: List[Occurrences]
(which expands to) List[List[(Char, Int)]]
请帮助我理解,为什么会发生这种情况,我该如何解决?
我尝试将其重写为flatMap ...,使用Intellij的“Explain Scala代码”等。
答案 0 :(得分:4)
实际上缺少括号:
type Occurrences = List[(Char, Int)]
def combinations(occurrences: Occurrences): List[Occurrences] =
if (occurrences.isEmpty) List(List())
else (for {
(c, n) <- occurrences
i <- n to 1 by -1
} yield (c, i)) :: combinations(occurrences.tail)
在您原始的理解代码中尝试产生(c, i) :: combinations(occurrences.tail)
List
,Any
/另一个Tuple
内有List
元素。
<强>更新强>
需要魔术的正确方法:
type Occurrences = List[(Char, Int)]
/**
* Returns the list of all subsets of the occurrence list.
* This includes the occurrence itself, i.e. `List(('k', 1), ('o', 1))`
* is a subset of `List(('k', 1), ('o', 1))`.
* It also include the empty subset `List()`.
*
* Example: the subsets of the occurrence list `List(('a', 2), ('b', 2))` are:
*
* List(
* List(),
* List(('a', 1)),
* List(('a', 2)),
* List(('b', 1)),
* List(('a', 1), ('b', 1)),
* List(('a', 2), ('b', 1)),
* List(('b', 2)),
* List(('a', 1), ('b', 2)),
* List(('a', 2), ('b', 2))
* )
*
* Note that the order of the occurrence list subsets does not matter -- the subsets
* in the example above could have been displayed in some other order.
*/
def combinations(occurrences: Occurrences): List[Occurrences] =
occurrences.foldRight(List[Occurrences](Nil)) {
case ((ltr, cnt), acc) =>
acc ::: (for {
comb <- acc
ltrNum <- 1 to cnt
} yield (ltr, ltrNum) :: comb)
}
对this code的作者的所有赞誉。