Scala将列表分组为具有一个共享元素的列表元组

时间:2017-02-05 01:35:59

标签: scala functional-programming

什么是拆分列表的简短功能方法

List(1, 2, 3, 4, 5) into List((1,2), (2, 3), (3, 4), (4, 5))

3 个答案:

答案 0 :(得分:5)

(假设您不关心嵌套对是列表而不是元组)

Scala集合具有sliding窗口函数:

@ val lazyWindow = List(1, 2, 3, 4, 5).sliding(2)
lazyWindow: Iterator[List[Int]] = non-empty iterator

实现收藏:

@ lazyWindow.toList
res1: List[List[Int]] = List(List(1, 2), List(2, 3), List(3, 4), List(4, 5))

你甚至可以做更多的事情" funcy"窗口,如长度3,但步骤2:

@ List(1, 2, 3, 4, 5).sliding(3,2).toList
res2: List[List[Int]] = List(List(1, 2, 3), List(3, 4, 5))

答案 1 :(得分:3)

您可以zip列表及其

val list = List(1, 2, 3, 4, 5)
// list: List[Int] = List(1, 2, 3, 4, 5)

list zip list.tail
// res6: List[(Int, Int)] = List((1,2), (2,3), (3,4), (4,5))

答案 2 :(得分:1)

我一直是pattern matching的粉丝。所以你也可以这样做:

val list = List(1, 2, 3, 4, 5, 6)

  def splitList(list: List[Int], result: List[(Int, Int)] = List()): List[(Int, Int)] = {
    list match {
      case Nil => result
      case x :: Nil => result
      case x1 :: x2 :: ls => splitList(x2 :: ls, result.:+(x1, x2))
    }
  }

  splitList(list)
  //List((1,2), (2,3), (3,4), (4,5), (5,6))