Scala-печатные массивы
похоже, что поддержка печатных массивов несколько отсутствует в Scala. Если вы напечатаете его, вы получите мусор по умолчанию, который вы получите в Java:
scala> val array = Array.fill(2,2)(0)
array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0))
scala> println(array)
[[I@d2f01d
кроме того, вы не можете использовать методы Java toString/deepToString из java.утиль.Класс массивов: (или, по крайней мере, я не могу понять это)
scala> println(java.util.Arrays.deepToString(array))
<console>:7: error: type mismatch;
found : Array[Array[Int]]
required: Array[java.lang.Object]
println(java.util.Arrays.deepToString(array))
лучшее решение, которое я мог бы найти для печати 2D массива, это сделать следующее:
scala> println(array.map(_.mkString(" ")).mkString("n"))
0 0
0 0
есть ли более идиоматические способ сделать это?
7 ответов:
в Scala 2.8, вы можете использовать
deepметод, определенный на массиве, который возвращает IndexedSeq, содержащий все (возможно, вложенные) элементы этого массива, и вызывает mkString на этом:scala> val array = Array.fill(2,2)(0) array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0)) scala> println(array.deep.mkString("\n")) Array(0, 0) Array(0, 0)возвращаемый IndexedSeq по умолчанию имеет stringprefix 'Array', поэтому я не уверен, дает ли это именно то, что вы хотели.
Как насчет этого:
scala> val array = Array.fill(2,2)(0) array: Array[Array[Int]] = Array(Array(0, 0), Array(0, 0)) scala> import scala.runtime.ScalaRunTime._ import scala.runtime.ScalaRunTime._ scala> val str = stringOf(array) str: String = Array(Array(0, 0), Array(0, 0))
добавив немного больше к ответу Арьяна - вы можете использовать метод mkString для печати и даже указать разделитель между элементами. Например :
val a = Array(1, 7, 2, 9) a.mkString(" and ") // "1 and 7 and 2 and 9" a.mkString("<", ",", ">") //mkString(start: String, sep: String, end: String) // "<1,7,2,9>"
попробуйте просто это:
// create an array val array1 = Array(1,2,3) // print an array elements seperated by comma println(array1.mkString(",")) // print an array elements seperated by a line println(array1.mkString("\n")) // create a function def printArray[k](a:Array[k])= println(a.mkString(",")) printArray(array1)
способ "функционального программирования" для этого (насколько я понимаю):
scala> array foreach{case a => a foreach {b => print(b.toString + " ")}; print('\n')} 0 0 0 0или если вы действительно не заботитесь о интервале:
scala> array foreach{a => a foreach println} 0 0 0 0ИМХО, функциональное программирование может стать немного грязным, если это займет слишком много времени, чтобы сделать это, я бы сказал, просто идти с императивным способом.
вы можете получить аккуратное форматирование массива [Array[Somethings]] с пользовательскими разделителями для внутреннего, а также внешнего массива следующим образом:
def arrayToString(a: Array[Array[Int]]) : String = { val str = for (l <- a) yield l.mkString("{", ",", "}") str.mkString("{",",\n","}") } val foo = Array.fill(2,2)(0) println(arrayToString(foo))в результате:
{{0,0}, {0,0}}
Comments