在Scala中选择并删除包含多个术语的列表中的元素

时间:2016-11-04 14:25:32

标签: scala list

我正在使用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个:

  1. 头部将包括8个。例如:List(8,4,5,6,7) => List(8,4)
  2. 8除了left.ex:List(2,2,8,5,6) => List(2,2,8)
  3. 上的重复元素 如果它在相同的数字之间,那么
  4. 8也是相同值的桥,因此可以包括它们。恩。 List(1,8,1,2,1) => List(1,8,1)
  5. 所以对于上面的例子,结果应该是:

    aList = List(List(2,2,8),List(8,4),List(1,8,1))
    

    这个条款对我来说有点困难。是否有可能创建这样的代码?

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))