0

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

请帮忙。我完全失去了(

4

2 回答 2

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。要告诉编译器在将数组传递给 Listapply方法时将其转换为可变参数,请: _*在末尾添加(空格是可选的):

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
于 2013-10-01T13:20:20.693 回答
0

你可以用它的操作符把任何数组变成一个列表toList,避免这个问题(Shadowlands 已经解释过这个问题)。您可以在一行中执行字符串 -> 数组 -> 列表:

line.split(',').toList

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

于 2013-10-02T08:50:26.397 回答