您可以将.foldLeft 与新列表一起用作累加器(假设列表彼此相邻)
def mergeDuplicates(list: List[Int]): List[Int] = {
list.foldLeft(List.empty[Int]) {
case (l, elem) if l.lastOption.contains(elem) =>
l.dropRight(1) :+ (2 * elem)
case (l, elem) =>
l :+ elem
}
}
println(mergeDuplicates(List(1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9)))
// output List(1, 2, 6, 4, 5, 12, 7, 8, 9)
使用extension method,
implicit class ListOps(list: List[Int]) {
def mergeDuplicates: List[Int] = {
list.foldLeft(List.empty[Int]) {
case (l, elem) if l.lastOption.contains(elem) =>
l.dropRight(1) :+ (2 * elem)
case (l, elem) =>
l :+ elem
}
}
}
val mergedList = List(1, 2, 3, 3, 4, 5, 6, 6, 7, 8, 9).mergeDuplicates
println(mergedList)