Programing

Scala-배열 인쇄

crosscheck 2020. 11. 7. 09:00
반응형

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.util.Arrays 클래스에서 Java toString / deepToString 메소드를 사용할 수 없습니다. (또는 적어도 알아낼 수 없습니다)

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

더 관용적 인 방법이 있습니까?


Scala 2.8에서는 deepArray에 정의 된 메서드를 사용 하여이 배열의 모든 (중첩 된) 요소를 포함하는 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))

Arjan의 대답에 조금 더 추가-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)

나는 차라리 이것을 좋아한다.

Array(1, 7, 2, 9).foreach(println)

이 작업을 수행하는 "기능적 프로그래밍"방법은 다음과 같습니다.

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

IMHO, 함수형 프로그래밍은 약간 지저분해질 수 있습니다. 이것을 만드는 데 시간이 너무 오래 걸리면 명령형 방식으로 가야합니다.


내부 및 외부 배열에 대한 사용자 지정 구분 기호를 사용하여 Array [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}}

참고 URL : https://stackoverflow.com/questions/3328085/scala-printing-arrays

반응형