【问题标题】:Scala: can not print list elementsScala:无法打印列表元素
【发布时间】:2013-10-01 12:58:43
【问题描述】:

我做了“mkString”,但仍然无法打印字符串列表。带输入线:

9002194187,2644,54,100,3,4,2,5

我得到以下输出:

Line: 9002194187,2644,54,100,3,4,2,5
StrArr: 9002194187,2644,54,100,3,4,2,5
Lst: [Ljava.lang.String;@223d2e6c
Lst again: List([Ljava.lang.String;@223d2e6c)
Lst1: [Ljava.lang.String;@223d2e6c
Result: foo

从下面的代码:

def mkRecord(line: String) : String = {
    val klass = "foo"
    val strArr = line.split(",") // convert string to array of strings
    println("Line: "+line)
    println("StrArr: "+strArr.mkString(","))
    val lst = List(strArr)
    println("Lst: "+lst.mkString(" - "))
    println("Lst again: "+lst)
    val lst1 = lst.tail ++ List(klass) // attribute list except for the first one, plus new klass attribute
    println("Lst1: "+lst.mkString(" , "))
    val result = lst1.mkString(",") // attribute string
    println("Result: "+ result)
    return result
  }

请帮忙。我完全不知所措(

【问题讨论】:

    标签: list scala printing


    【解决方案1】:

    List 的构造函数(实际上是 List 伴随对象的 apply 方法)以 scala 的“varargs”等效形式获取参数:

    def apply[A](xs: A*): List[A] // some irrelevant details have been elided
    

    在java中,这会写成这样:

    public static List<A> apply(A... args)
    

    在 scala 中,这个 可以 使用任何 Seq(或子类)调用,但使用特殊符号。您使用的线路:

    val lst = List(strArr)
    

    创建一个带有单个条目的List[Array[String]] - 数组strArr。要告诉编译器在将数组传递给 List apply 方法时将其转换为可变参数,请在末尾添加 : _*(空格可选):

    val lst = List(strArr: _*)
    

    您的代码中的这种更改将导致:

    scala> mkRecord(chkStr)
    Line: 9002194187,2644,54,100,3,4,2,5
    StrArr: 9002194187,2644,54,100,3,4,2,5
    Lst: 9002194187 - 2644 - 54 - 100 - 3 - 4 - 2 - 5
    Lst again: List(9002194187, 2644, 54, 100, 3, 4, 2, 5)
    Lst1: 9002194187 , 2644 , 54 , 100 , 3 , 4 , 2 , 5
    Result: 2644,54,100,3,4,2,5,foo
    res1: String = 2644,54,100,3,4,2,5,foo
    

    【讨论】:

    • 在哪里可以了解“:_*” Scala 运算符?非常感谢您提供详细信息!
    • 搜索“scala varargs”之类的词,应该会打到this one之类的页面
    • @AntonAshanin 在 Shadowlands 的示例中,下划线提供了类型归属,在大多数描述下划线各种用途的页面中都没有很好地记录这一点。 docs.scala-lang.org/style/types.html
    【解决方案2】:

    您可以使用toList 运算符将任何数组转换为列表,从而避免这个问题(Shadowlands 已经解释了其本质)。您可以在一行中执行字符串 -> 数组 -> 列表:

    line.split(',').toList
    

    使用集合的toList 方法通常比将所有元素提取到序列中然后将该序列转换为列表要快,尤其是因为您将使用针对源集合优化的方法。但是,这是一种优化,您可以在成功和清晰的优先级之后担心它。

    【讨论】:

    • 值得注意的是,从 Scala 2.10 开始,.toList 和所有许多类似的集合转换函数都将它们的功能合并到“.to”中。你的例子可以写成 line.split(',').to[List]
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多