Sandra
Sandra

Reputation: 95

For loop with two variables in scala

I have the following java code:

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

  }

The output is :

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

I would like to do the same thing in scala, I tried this but it does not work:

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

The output is:

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
....

I have not find a way to have two variables in the same level. Thank you for your answer.

Upvotes: 2

Views: 845

Answers (4)

Tim
Tim

Reputation: 27431

j is just a copy of i so this is one solution:

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

This pattern works in any situation where j is just a function of i

Upvotes: 0

J&#246;rg W Mittag
J&#246;rg W Mittag

Reputation: 369624

Since both variables always have the same value, you actually only need one of them. In Scala, you would generally not use a loop to solve this problem, but use higher-level collection operations instead. Something like:

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

Note: this will only generate the string that you want to print, but not actually print it. It is generally considered a good thing to not mix generating data and printing data.

If you want to print this, you only need to pass it to println:

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

Or, in Scala 2.13+:

import scala.util.chaining._

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

You could also write it like this:

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

Now, you might say, "Wait a minute, didn't you just say that we don't use loops in Scala?" Well, here's the thing: that's not a loop! That is a for comprehension. It is actually syntactic sugar for collection operations.

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

is actually just syntactic sugar for

bar map { foo => baz(foo) }

A for comprehension simply desugars into calls to map, flatMap, foreach, and withFilter. It is not a loop.

Note that Scala does have a while loop. It exists mainly for performance reasons. Unless you are writing low-level libraries that are going to be used in performance-intensive code by tens of thousands of developers, please just pretend that it doesn't exist.

Also note that if the while loop weren't built into Scala, you could easily write it yourself:

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

Upvotes: 3

Nikunj Kakadiya
Nikunj Kakadiya

Reputation: 3008

you can do it as below

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

Upvotes: 0

Mateusz Kubuszok
Mateusz Kubuszok

Reputation: 27595

Scala's replacement would be

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

To avoid the confusion I suggest reading what for is the syntactic sugar for (as opposed to Java it is not specialized while).

Upvotes: 5

Related Questions