打印没有flatMap的列表项

时间:2016-02-07 18:24:01

标签: scala

我有这个scala program无法编译,为什么会这样?我正在尝试打印列表/子列表中的所有数字而不使用flatMap:

object HelloWorld extends App {

  def test() = {
    val numbs = List ((1,1,1),(2,2,2),(3,3,3))
    val a = for {
      i <- numbs
      j <- i
    } yield j
    println(a)
  }

  test()

}

这是错误:

HelloWorld.scala:7: error: value map is not a member of (Int, Int, Int)                                                                                               
      j <- i                                                                                                                                                                    
           ^                                                                                                                                                                    
one error found 

应打印List (1,1,1,2,2,2,3,3,3)

4 个答案:

答案 0 :(得分:0)

您不能使用常用方法迭代元组。元组用来表示不同事物的组合,迭代它们通常没用。如果你真的需要,可以通过索引来实现:

val a = for {
  i <- numbs
  j <- 0 until i.productArity
} yield i.productElement(j)

但是,如果您正在做一些非常通用的事情,例如格式化文本输出的元组,这似乎真的很有用。否则,您应该将数据保存为列表列表。

答案 1 :(得分:0)

没有为元组定义的地图。您需要从元组3创建一个List。这是你可以做到的一种方式:

def test() = {
  val numbs = List((1, 1, 1), (2, 2, 2), (3, 3, 3))
  val a = for {
    i <- numbs
    j <- List(i._1, i._2, i._3)
  } yield j
  println(a)
}

test() // prints List(1, 1, 1, 2, 2, 2, 3, 3, 3)

答案 2 :(得分:0)

就像在其他答案中所说的那样,没有为元组定义的地图。如果您不需要使用List[Tuples],则解决方案是将变量numbs用作:

val numbs = List(List(1,1,1), List(2,2,2), List(3,3,3)))

您的代码将按预期工作。

答案 3 :(得分:0)

如果你坚持使用元组,你也可以像这样使用productIterator:

object HelloWorld extends App {

  def test() = {
    val numbs = List((1, 1, 1), (2, 2, 2), (3, 3, 3))
    val a = for {
      i <- numbs
      j <- i.productIterator
    } yield j
    println(a)
  }

  test()
}

但也许最好考虑列表列表。