2017-05-29 20 views
2

我正在嘗試一些使用scala的基本邏輯。我嘗試了下面的代碼,但它會引發錯誤。如何在scala中平坦化?

scala> val data = ("HI",List("HELLO","ARE")) 
data: (String, List[String]) = (HI,List(HELLO, ARE)) 

scala> data.flatmap(elem => elem) 
    <console>:22: error: value flatmap is not a member of (String, List[String]) 
      data.flatmap(elem => elem) 

預期輸出:

(HI,HELLO,ARE) 

能有人幫我解決這個問題?

+1

你的意思是你想將這個'Tuple2'轉換成'Tuple3'嗎? –

回答

1

您試圖flatMapTuple2這是不提供current api

如果你不想改變你的輸入,你可以從Tuple2extract該提取物如下

val data = ("HI",List("HELLO","ARE")) 
val output = (data._1, data._2(0), data._2(1)) 
println(output) 
+0

感謝您的所有答案。這個答案符合我的要求 –

+0

高興地幫助你。 @SurenderRaja,如果它對你有幫助,你也可以加註;) –

4

您試圖對一個元組進行flatMap,這是行不通的。下面的工作:

val data = List(List("HI"),List("HELLO","ARE")) 

val a = data.flatMap(x => x) 
+0

有效;),+1,我喜歡簡單的方式 –

2

這將是Scala中很瑣碎:

val data = ("HI",List("HELLO","ARE")) 
println(data._1 :: data._2) 

什麼確切的數據結構是你的工作?

如果你清楚你的數據結構:

type rec = (String, List[String]) 

val data : rec = ("HI",List("HELLO","ARE")) 

val f = (v: (String, List[String])) => v._1 :: v._2 

f(data) 
+0

是啊!爲什麼不?還有效,+1 –

1

如果這是你想要什麼:

val data = ("HI",List("HELLO,","ARE").mkString("")) 
println(data) 

>>(HI,HELLO,ARE) 
2

幾個觀測的用於第二元組值的值:

  1. 目前存在用於元組沒有flatten方法(除非使用shapeless)。

  2. flatMap不能直接應用到元素和集合的混合元素列表。

在你的情況,你可以做一個List的元素 「HI」 的一部分:

val data = List(List("HI"), List("HELLO","ARE")) 

data.flatMap(identity) 

或者,你可以定義一個函數來處理相應的混合元素類型:

val data = List("HI", List("HELLO","ARE")) 

def flatten(l: List[Any]): List[Any] = l.flatMap{ 
    case x: List[_] => flatten(x) 
    case x => List(x) 
} 

flatten(data) 
+0

Gooood one!....... –