代码之家  ›  专栏  ›  技术社区  ›  I82Much

scala-打印数组

  •  62
  • I82Much  · 技术社区  · 14 年前

    似乎对打印数组的支持在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数组类使用JavaToSt/Debug字符串方法:(或者至少我不能计算出来)

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

    我能找到的打印二维数组的最佳解决方案是执行以下操作:

    scala> println(array.map(_.mkString(" ")).mkString("\n"))
    0 0
    0 0
    

    有没有更惯用的方法?

    7 回复  |  直到 7 年前
        1
  •  110
  •   Arjan Blokzijl    14 年前

    在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”,因此我不确定这是否正好满足您的需要。

        2
  •  34
  •   Eastsun    14 年前

    这个怎么样?

    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))
    
        3
  •  11
  •   Ben Aiad    9 年前

    在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>" 
    
        4
  •  5
  •   Noha Elprince    8 年前

    尝试以下简单方法:

      // 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)
    
        5
  •  1
  •   Enrico Susatyo    14 年前

    实现这一点的“功能编程”方法(就我而言)是:

    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,函数式编程可能会变得有点混乱,如果做这件事花费太长时间,我会说,用命令式的方式就行了。

        6
  •  1
  •   David Weber    12 年前

    您可以使用内部和外部数组的自定义分隔符获得数组[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}}
    
        7
  •  1
  •   rupert160    7 年前

    我更喜欢这个:

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