转换对中的Scala序列

时间:2015-08-31 08:49:29

标签: scala scala-collections

我有一个这样的序列:

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);

我要转换为val l = Seq(1,2,3,4)

以下是我的尝试:

List(Seq(1,2), Seq(2,3), Seq(3,4))

这奇怪似乎不起作用?有什么建议吗?

4 个答案:

答案 0 :(得分:7)

您也可以使用sliding

l.sliding(2).toList
res1: List[Seq[Int]] = List(List(1, 2), List(2, 3), List(3, 4))

答案 1 :(得分:3)

好的,我了解了zip方法:

if

答案 2 :(得分:1)

已经给出的答案描述得很好,如何以scala方式执行此操作。 但是,您可能还需要解释为什么您的代码不起作用,所以它来了:

您的getPairs函数需要一个元组列表作为输入并返回一个元组列表。但是你说你想将单个值列表转换为元组列表。因此,如果您致电getPairs(l),您将收到type mismatch编译错误。

您必须重构代码才能获得一个简单的列表:

def pairs(in: Seq[Int]): Seq[(Int, Int)] = {
  @tailrec
  def recursive(remaining: Seq[Int], result: Seq[(Int, Int)]): Seq[(Int, Int)] = {
    remaining match {
      case Nil => result
      case last +: Nil => result
      case head +: next +: tail => recursive(next +: tail, (head, next) +: result)
    }
  }

  recursive(in, Nil).reverse
}

从这里开始,这是通用功能的一小步:

def pairs2[A](in: Seq[A]): Seq[(A, A)] = {
  @tailrec
  def recursive(remaining: Seq[A], result: Seq[(A, A)]): Seq[(A, A)] = {
    remaining match {
      case Nil => result
      case last +: Nil => result
      case head +: next +: tail => recursive(next +: tail, (head, next) +: result)
    }
  }

  recursive(in, Nil).reverse
}

答案 3 :(得分:0)

使用for comprehension,例如如下,

for ( (a,b) <- l zip l.drop(1) ) yield Seq(a,b)

注意l.drop(1)(与l.tail相反)如果l为空或最多只有一个项目,则会提供一个空列表。