2012-09-12 95 views
2

我想一个字符串列表转换为字符向量的向量:列表[字符串] - >矢量矢量[字符]

import collection.breakOut 

def stringsToCharVectors(xs: List[String]) = 
    xs.map(stringToCharVector)(breakOut) : Vector[Vector[Char]] 

def stringToCharVector(x: String) = 
    x.map(a => a)(breakOut) : Vector[Char] 

是否有实现stringToCharVector不涉及办法与身份函数映射?一般来说,实施stringsToCharVectors是否有更短的/更好的方法?

回答

8

您可以直接传递一个String的可变参数构造函数Vector

def stringToCharVector(x: String) = Vector(x: _*) 

此时有一个单独的方法似乎有点傻。 breakOut是为了优化;如果你只是想转换,你可以

Vector(xs.map(x => Vector(x: _*)): _*) 

在一个额外的对象每个列表元素相对适度的费用。 (所有的字符将最有可能是内存密集型的一部分。)

+0

感谢 - 这做了我想做的事情。但'x:_ *'是什么意思? x之后的冒号使我期待一种类型,但下划线看起来像是默认变量,并将星号添加到刚刚使我头部旋转。 – GlenPeterson

+3

':_ *'表示“将这个集合的元素作为单独的项目传递给一个采用可变参数的方法”。由于一个字符串可以被解释为一个字符集合,所以它可以工作。 –

5

在斯卡拉2.10:

scala> val xs = List("hello") 
xs: List[String] = List(hello) 

scala> xs.map(_.to[Vector]).to[Vector] 
res0: Vector[Vector[Char]] = Vector(Vector(h, e, l, l, o)) 
1

另一种方法是刚刚的所有元素添加到一个空的向量;当您调用转换方法时,无论如何都会发生这种情况:

def stringsToCharVectors(xs: List[String]) = 
    Vector() ++ xs.map(Vector() ++ _)