watzon
watzon

Reputation: 2549

Scala formatting Array.mkString

I am trying to get a uniform layout when I print out rows from a multidimensional array in Scala. Basically the output I'm trying to get is this:

1   2   3   4   5   6   7   8   9  10  11  12
2   4   6   8  10  12  14  16  18  20  22  24
3   6   9  12  15  18  21  24  27  30  33  36

Basically I want 4 spaces in between, but it needs change when the digit is longer than 1 character. Any Ideas? All I've come up with so far is this:

object Main {
  def main(args: Array[String]) {
    var i1, i2 = 0
    var grid = Array.ofDim[Int](12, 12)

    for(i1 <- 1 to 12){

      for(i2 <- 1 to 12) {
        grid(i1-1)(i2-1) = i1 * i2
      }

    }

    for (g <- grid) {
      println(g.mkString("\t"))
    }

  }
}

But tabs are too long and indent the wrong way

Upvotes: 1

Views: 647

Answers (1)

som-snytt
som-snytt

Reputation: 39577

Formatting:

scala> for (g <- grid) println(g map (i => f"$i%4d") mkString)
   1   2   3   4   5   6   7   8   9  10  11  12

Edit for completeness:

Welcome to Scala 2.12.0-M3 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_60).
Type in expressions for evaluation. Or try :help.

scala> :pa
// Entering paste mode (ctrl-D to finish)

    var i1, i2 = 0
    var grid = Array.ofDim[Int](12, 12)

    for(i1 <- 1 to 12){

      for(i2 <- 1 to 12) {
        grid(i1-1)(i2-1) = i1 * i2
      }

    }

// Exiting paste mode, now interpreting.

i1: Int = 0
i2: Int = 0
grid: Array[Array[Int]] = Array(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), Array(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24), Array(3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36), Array(4, 8, 12, 16, 20, 24, 28, 32, 36, 40, 44, 48), Array(5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60), Array(6, 12, 18, 24, 30, 36, 42, 48, 54, 60, 66, 72), Array(7, 14, 21, 28, 35, 42, 49, 56, 63, 70, 77, 84), Array(8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96), Array(9, 18, 27, 36, 45, 54, 63, 72, 81, 90, 99, 108), Array(10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120), Array(11, 22, 33, 44, 55, 66, 77, 88, 99, 110, 121, 132), Array(12, 24, 36, 48, 60, 72, 84, 96, 108, 120, 132, 144))

scala> for (g <- grid) println(g map (i => f"$i%4d") mkString)
warning: there was one feature warning; re-run with -feature for details
   1   2   3   4   5   6   7   8   9  10  11  12
   2   4   6   8  10  12  14  16  18  20  22  24
   3   6   9  12  15  18  21  24  27  30  33  36
   4   8  12  16  20  24  28  32  36  40  44  48
   5  10  15  20  25  30  35  40  45  50  55  60
   6  12  18  24  30  36  42  48  54  60  66  72
   7  14  21  28  35  42  49  56  63  70  77  84
   8  16  24  32  40  48  56  64  72  80  88  96
   9  18  27  36  45  54  63  72  81  90  99 108
  10  20  30  40  50  60  70  80  90 100 110 120
  11  22  33  44  55  66  77  88  99 110 121 132
  12  24  36  48  60  72  84  96 108 120 132 144

scala> for (g <- grid) println(g map (i => "%4d" format i) mkString)
warning: there was one feature warning; re-run with -feature for details
   1   2   3   4   5   6   7   8   9  10  11  12
   2   4   6   8  10  12  14  16  18  20  22  24
   3   6   9  12  15  18  21  24  27  30  33  36
   4   8  12  16  20  24  28  32  36  40  44  48
   5  10  15  20  25  30  35  40  45  50  55  60
   6  12  18  24  30  36  42  48  54  60  66  72
   7  14  21  28  35  42  49  56  63  70  77  84
   8  16  24  32  40  48  56  64  72  80  88  96
   9  18  27  36  45  54  63  72  81  90  99 108
  10  20  30  40  50  60  70  80  90 100 110 120
  11  22  33  44  55  66  77  88  99 110 121 132
  12  24  36  48  60  72  84  96 108 120 132 144

scala> 

Upvotes: 4

Related Questions