Scala:无法打印列表元素

时间:2013-10-01 12:58:43

标签: list scala printing

我做了“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
  }

请帮忙。我完全失去了(

2 个答案:

答案 0 :(得分:2)

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方法时将数组转换为varargs,最后添加: _*(空格是可选的):

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

答案 1 :(得分:0)

您可以将任何数组转换为具有toList运算符的列表,从而避免此问题(Shadowlands已解释过的性质)。你可以做字符串 - &gt;数组 - &gt;列在一行:

line.split(',').toList

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