val list= (List('a,'a,'a,'a,'b,'b,'b,'c,'c,'c,'c,'d,'e,'e,'e,'f,'a))
def pack[list](ls : List[list]):List[List[list]] = {
if (ls.isEmpty) List(List())
else {
val (packed, next) = ls span { _ == ls.head }
if(next == Nil) List(packed)
else packed :: pack(next)
}
}
println(pack(list))
}
输出: 列表(列表('a,'a,'a,'a),列表('b,'b,'b),列表('c,'c,'c, 'c),列表('d),列表('e,'e,'e),列表('f),列表('a))
任何人都可以解释这段代码是如何运作的。
答案 0 :(得分:1)
span
“返回其元素全部满足的列表的最长前缀 给出谓词,以及列表的其余部分。“
这里的列表是ls参数,ls.head是列表的第一项 然后将这两个列表分配给packed(包含最长前缀),然后将其包含其余列表。如果next为空,则返回前缀列表,否则会有一个递归调用将前缀列表与递归结果连接