1

我想要在 Scala 2.9.3 中将 (k,v) 元组的嵌套列表转换为 (v,k) 的平面列表。我尝试将所需的函数文字放在 flatMap 中。但是会发生这种情况:

scala> List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
<console>:16: error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: List[(Int, java.lang.String)]
       List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
                                                                              ^
<console>:16: error: not found: value v
       List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
                                                                                        ^
<console>:16: error: not found: value k
       List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) ).flatMap{ case (k,v) => (v,k) }
                                                                                      ^

为什么这会发生在我身上?

4

2 回答 2

3

您应该在这里使用flattenand map,而不是flatMap.

flatMaponList[a]接受函数A => List[B](实际上不是List[B],而是任何集合B)并返回List[B]。这不是你的情况。

你有一个功能C => B,没有List[C] => List[B]。在你的情况下AList[C].

maponList[A]接受一个函数A => B并返回List[B].

val listOfLists = List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) )
listOfLists.flatten.map{ case (k,v) => (v,k) }
// List[(String, Int)] = List((123,1), (abc,1), (qwer,45))

您可以使用flatMap,但List[List[A]]您必须提供一个函数,该函数接受List[A]如下参数:

listOfLists.flatMap( _.map{case (k,v) => (v,k)} )
// List[(String, Int)] = List((123,1), (abc,1), (qwer,45))
于 2013-06-28T07:14:19.323 回答
1

这将起作用:

scala> val m =  List( List( (1,"123"), (1,"abc")), List( (45, "qwer")) )
m: List[List[(Int, java.lang.String)]] = List(List((1,123), (1,abc)), List((45,qwer)))

scala> m.flatten.map { case (k,v) => (v,k) }
res0: List[(java.lang.String, Int)] = List((123,1), (abc,1), (qwer,45))

基本上,您首先展平嵌套列表,然后映射以重新排序元组。

于 2013-06-28T07:18:12.223 回答