如何使用foreach方法在Scala中连接两个值

时间:2018-07-17 11:55:10

标签: scala

我要连接以下两个值:

val x: Range = (1 to 20)

val y: List[List[Double]] = List(List(4.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99), List(4.99, 4.99, 4.99, 4.99, 4.99, 4.99, 0.0, 0.0))

所需的输出:

表1的顺序为(4.99、8.99、8.99、8.99、8.99、8.99、8.99、8.99)

表2的顺序为(4.99、8.99、8.99、8.99、8.99、8.99、8.99、8.99)

获取:

Table 1List(4.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99)
Table 1List(4.99, 4.99, 4.99, 4.99, 4.99, 4.99, 0.0, 0.0)
Table 2List(4.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99)
Table 2List(4.99, 4.99, 4.99, 4.99, 4.99, 4.99, 0.0, 0.0)

我用foreach和println得到了上面的内容:

x.foreach(i=>{
  y.foreach(j=>{
  println("Table " + i +" order is " + j)
  })})

所以我有两个问题:

  1. 如何停止重复

  2. 如何从输出中删除列表。

谢谢

2 个答案:

答案 0 :(得分:0)

您似乎不想迭代y1 to 20的笛卡尔积。请改用zipWithIndex。要在输出中消除List(...),请使用mkString

for ((list, tableIdx) <- y.zipWithIndex) {
  println(s"Table ${tableIdx + 1} order is ${list.mkString("(", ", ", ")")}")
}

答案 1 :(得分:0)

我认为您不需要值x即可完成所需的操作:您可以对代码进行如下修改,以得到不需要重复的输出:

   y.zipWithIndex.foreach(j=>{
     println("Table " + (j._2+1) +" order is " + j.toString.drop(5).dropRight(3))
    })

您问题的具体答案是:

  1. 如果您从代码中删除x值,则不会重复。

  2. 使用j.toString.drop(5).dropRight(3),由于List(的操作,您将不会获得zipWithIndex(5个字符)和尾随的3个字符。

在Scala REPL中:

scala> y.zipWithIndex.foreach(j=>{
        println("Table " + (j._2+1) +" order is " + j.toString.drop(5).dropRight(3))
      })
Table 1 order is (4.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99, 8.99)
Table 2 order is (4.99, 4.99, 4.99, 4.99, 4.99, 4.99, 0.0, 0.0)