我正在使用scala
作为我的逻辑程序。我在列表中创建了列表,每个列表包含5个元素,例如:
val aList = List(List(2,2,8,5,6),List(8,4,5,6,7),List(1,8,1,2,1))
//the child list could be more than 3
我正在尝试使用以下代码删除非重复元素:
def f(xs: List[Int]) = xs match {
case x0 :: x1 :: _ if x0 == x1 => Some(xs.takeWhile(_ == x0))
case _ => None
}
val aSelected = aList.flatMap(f)
结果是:
aSelected: List(List(2,2),List(1,1,1))
但问题是我需要包括8如果它是头部,而8是尾部,这个术语应该包括8个:
List(8,4,5,6,7) => List(8,4)
List(2,2,8,5,6) => List(2,2,8)
List(1,8,1,2,1) => List(1,8,1)
所以对于上面的例子,结果应该是:
aList = List(List(2,2,8),List(8,4),List(1,8,1))
这个条款对我来说有点困难。是否有可能创建这样的代码?
答案 0 :(得分:1)
一个接一个地考虑列表。在每个列表中取数字是8或当前列表的头部。
考虑只获得8的情况,并考虑只有一个数字的情况。
当你只有8.如果你没有下一个元素,请忽略。如果你有下一个元素,那么返回List(8,thatNumber)
当你有一个8以外的数字时,如果没有下一个元素则忽略。如果你有下一个元素,那么继续。
每当你得到(重复和8个)部分列表时,从主列表中删除该列表并继续列表的其余部分。
def foo(list: List[List[Int]]): List[List[Int]] = {
def helper(currentList: List[Int], result: List[List[Int]]): List[List[Int]] = currentList match {
case Nil => result
case xList if xList.nonEmpty =>
val xs = currentList.takeWhile(p => p == 8 || p == currentList.head)
xs match {
case Nil => result
case 8 :: _ =>
currentList match {
case Nil => result
case 8 :: x :: _ => helper(currentList.drop(2), result ::: List(8 :: x :: Nil))
}
case a :: Nil =>
result
case as =>
helper(currentList.drop(as.length), result ::: List(as))
}
}
list.flatMap(helper(_, List.empty[List[Int]]))
}
Scala REPL
scala> val result = foo(aList)
result: List[List[Int]] = List(List(2, 2, 8), List(8, 4), List(1, 8, 1))