我做了“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
}
请帮忙。我完全失去了(
答案 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
方法通常比将所有元素提取到序列中然后将该序列转换为列表更快,这不仅仅是因为您将使用针对源集合优化的方法。但是,这是一个优化,您可以在成功和明确的优先级之后担心。