【问题标题】:For loop with two variables in scala在scala中有两个变量的for循环
【发布时间】:2021-02-02 17:49:51
【问题描述】:

我有以下java代码:

    for (int i = 0, j = 0; i < 10 && j < 10 0; i++, j++)
  {
           System.out.println("i = " + i + " :: " + "j = " + j);

  }

输出是:

i = 0 :: j = 0
i = 1 :: j = 1
i = 2 :: j = 2
i = 3 :: j = 3
i = 4 :: j = 4
i = 5 :: j = 5
....

我想在 scala 中做同样的事情,我试过了,但它不起作用:

for (i<- 0 to 9; j <- 0 to 9) 
{
     println("i = " + i + " :: " + "j = " + j) 
 }

输出是:

i = 0 :: j = 0
i = 0 :: j = 1
i = 0 :: j = 2
i = 0 :: j = 3
i = 0 :: j = 4
i = 0 :: j = 5
i = 0 :: j = 6
i = 0 :: j = 7
i = 0 :: j = 8
i = 0 :: j = 9
i = 1 :: j = 0
i = 1 :: j = 1
i = 1 :: j = 2
i = 1 :: j = 3
....

我还没有找到将两个变量放在同一级别的方法。 谢谢你的回答。

【问题讨论】:

  • 如果两个值都具有相同的值,那么拥有两个值又有什么意义呢?你到底想解决什么?顺便说一句,Scala 没有 for 循环,它有 for 理解,根本不涉及任何突变。
  • @LuisMiguelMejíaSuárez 我不认为这与实际上有两个相同的值有关。我猜这是关于一次迭代两个变量的原则。它可以使用for 和自定义结构或while 循环来完成,语法不那么性感(var i, var j, while(...) {... i+=1; j+=1}
  • for 在 Scala 中不是来自 Java 的 for 循环。在某些情况下,行为可能相似,但不能无脑地替代另一种。
  • @Nebril,是的,你是对的。这是关于一次迭代两个变量的原则。我怎样才能在 scala 中做到这一点?
  • @LuisMiguelMejíaSuárez 好的,我把我想解决的问题分享给你。

标签: scala


【解决方案1】:

Scala 的替代品是

for {
  (i, j) <- (0 to 9) zip (0 to 9)
} {
  println("i = " + i + " :: " + "j = " + j) 
}

为了避免混淆,我建议阅读 for 的语法糖(与 Java 不同,它不是专门的 while)。

【讨论】:

    【解决方案2】:

    由于两个变量始终具有相同的值,因此您实际上只需要其中一个。在 Scala 中,您通常使用循环来解决此问题,而是使用更高级别的集合操作。比如:

    (0 to 9) map { i => s"i = $i :: j = $i" } mkString "\n"
    

    注意:这只会生成您要打印的字符串,而不是实际打印它。通常认为不混合生成数据和打印数据是一件好事。

    如果你想打印这个,你只需要把它传递给println

    println((0 to 9) map { i => s"i = $i :: j = $i" } mkString "\n")
    

    或者,在 Scala 2.13+ 中:

    import scala.util.chaining._
    
    (0 to 9) map { i => s"i = $i :: j = $i" } mkString "\n" pipe println
    

    也可以这样写:

    (for (i <- 0 to 9) yield s"i = $i :: j = $i") mkString "\n"
    

    现在,你可能会说,“等一下,你不是说我们在 Scala 中不使用循环吗?”好吧,事情是这样的:这不是一个循环!那是一个for理解。它实际上是集合操作的语法糖。

    for (foo <- bar) yield baz(foo)
    

    实际上只是

    的语法糖
    bar map { foo => baz(foo) }
    

    for 理解简单地取消了对 mapflatMapforeachwithFilter 的调用。它不是一个循环。

    请注意,Scala 确实有一个while 循环。它的存在主要是出于性能原因。除非您正在编写将被成千上万的开发人员用于性能密集型代码的低级库,否则请假装它不存在。

    还要注意,如果 while 循环没有内置到 Scala 中,您可以轻松地自己编写它:

    def whiley(cond: => Boolean)(body: => Unit): Unit =
      if (cond) { body; whiley(cond)(body) }
    

    【讨论】:

      【解决方案3】:

      你可以这样做

      val start = 0; val size = 10;
      for ((i, j) <- (start to size) zip (start to size))
       {
        println(s"i=$i j=$j")
      }
      

      【讨论】:

        【解决方案4】:

        j 只是i 的副本,所以这是一种解决方案:

        for {
          i <- 0 to 9
          j = i
        } {
          println("i = " + i + " :: " + "j = " + j) 
        }
        

        此模式适用于 j 只是 i 的函数的任何情况

        【讨论】:

          猜你喜欢
          • 2013-09-10
          • 2021-12-20
          • 1970-01-01
          • 2016-10-31
          • 2011-12-08
          • 1970-01-01
          • 2014-06-21
          • 2016-05-10
          • 1970-01-01
          相关资源
          最近更新 更多