2014-11-25 89 views
2

这似乎应该很容易,但我不能完全把它放在一起。我想获取一个字符串列表并创建一个新列表,其中包含两个来自第一个列表但具有不同后缀的每个元素。所以:Scala:创建一个新列表,其中每个元素都是不同后缀重复的旧列表元素

List("a", "b", "c") -> List("a_x", "a_y", "b_x", "b_y", "c_x", "c_y" 

我试图

val list2 = list1.map(i=> i+"_x", i+"_y") 

但斯卡拉说,我有太多的争论。这种亲近:

val list2 = list1.map(i=> (i+"_x", i+"_y")) 

,但它产生的列表(( “A_X”, “a_y”),( “B_X”, “b_y”),( “c_x”, “c_y”)),这是不是有什么我想要。我确定我错过了一些明显的东西。

回答

6

你想flatMap,先映射,然后将结果的结构扁平化为一个扁平列表。每个单独的结果本身必须是一个集合(不是一个元组):

scala> List("a", "b", "c").flatMap(i => List(i + "-x", i + "-y")) 
res0: List[String] = List(a-x, a-y, b-x, b-y, c-x, c-y) 
+0

谢谢!我知道这只是逃避我而已。 – 2014-11-25 13:38:34

6

随着对理解:

scala> val prefixes = List("a", "b", "c") 
prefixes: List[String] = List(a, b, c) 

scala> val suffixes = List("x", "y") 
suffixes: List[String] = List(x, y) 

scala> for (prefix <- prefixes; suffix <- suffixes) yield prefix + "_" + suffix 
res1: List[String] = List(a_x, a_y, b_x, b_y, c_x, c_y) 

这基本上是赛斯Tisue的回答只是语法糖。

相关问题