Почему mkString не работает в Scala? - PullRequest
0 голосов
/ 12 мая 2018

Я не могу получить массив для печати, как обычно строку в Scala

  val a = Array("woot","yeah","ok then").sorted

  for (i <- a.length-1 to 0 by -1)
    println(s"$i: ${a(i)}")

  val ab = ArrayBuffer(for (e <- a if e != null) yield e*3)

  println(ab.mkString(" "))

По какой-то причине это печатает:

2: yeah
1: woot
0: ok then
ArrayBuffer([Ljava.lang.String;@5034c75a)

И я ожидал, что он напечатает"yeahyeahyeah wootwootwoot ok thenok thenok then", то есть элементы в массиве (в виде строк), разделенные пробелом.Почему это не работает и что я делаю неправильно?

РЕДАКТИРОВАТЬ: хорошо, это показывало, потому что я инициализировал ab как один элемент ArrayBuffer сэтот массив в качестве элемента вместо элементов этого внутреннего массива, являющихся отдельными элементами буфера массива.

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Я думаю, что вы имели в виду

val ab = ArrayBuffer((for (e <- a if e != null) yield e*3): _*)
0 голосов
/ 13 мая 2018

Несколько более короткий ответ с использованием более функционального подхода:

val a = Array("woot","yeah","ok then").sorted.reverse
a.map(_ * 3).map(elem => print(elem + " ")

Редактировать: Если вы хотите получить результат в какой-то новой переменной, вы можете сделать это:

val string = a.map(_ * 3).mkString(" ")
0 голосов
/ 12 мая 2018

Если вы хотите напечатать каждый элемент массива, объединенный три раза, с пробелами между записями, то это просто:

println((for (e <- a) yield e * 3).mkString(" "))

это дает:

ok thenok thenok then wootwootwoot yeahyeahyeah

(и это правильный порядок, потому что вы хотели, чтобы он был отсортирован по алфавиту, и o <<code>w <<code>y)

Если вы хотите обратить массив в обратном порядке перед печатью, вы можете инициализировать его как

val a = Array("woot","yeah","ok then").sorted.reverse
...