2014-01-07 65 views
3

我想知道什麼是最好的方法將元素數組轉換爲字符串是當我想做某些特定的元素。例如說我有scala調用mkString,而操縱元素

case class A(x: Int, y: Int) 
val list = List(A(2, 3), A(4, 2), A(5, 1)) 

現在說我想要例如將其轉換爲逗號分隔列表只有x值。即「2,4,2」。有沒有辦法用mkString來實現這一點?

而一個相關的問題是如何處理列表內的列表。所以說,我們有:

case class A(x: Int, y: Int, bs: List(B)) 
case class B(z: Int) 

和下面的列表:

val list = List(A(2, 3, List(B(4), B(2))), A(4, 2, List()), A(5, 1, List(B(3)))) 

,我想結合說在B中的第一個元素生成類似A的輸出部分:「2:4, 「4」,。? 「5:3」

是否與mkString實現這個還是我找錯了樹的方式

感謝 德

回答

2

當然,你可以映射,然後再做出字符串:

val remapped = myList map { 
    case A(x, y) => "%s:%s" format (x, y) 
} 

remapped mkString (",") 

這將產生 「1:2,2:5」 格式。如果你只是想逗號分隔,那麼你可以flatMap:

val remapped = myList flatMap{ 
    case A(x, y) => List(x, y) 
} 

remapped mkString (",") 

這將給你「1,2,2,5」。

你能直接用mkString這麼做嗎?不,我不這麼認爲,除非你改寫的A像這樣的toString方法:

case class A(x: Int, y: Int){ 
    override def toString() = "%s:%s" format (x, y) 
} 

對於嵌套列表

你必須爭取多一點創意與unapply

myList map { 
    case A(x, _, head :: _) => "%s:%s" format (x, head.z) 
    case A(x, _, Nil) => x toString() 
} 

其中您正在提取B的嵌套列表的第一項。

0

您可以使用map改變你的價值觀是這樣的:

第一:

case class A(x: Int, y: Int) 
val list = List(A(2, 3), A(4, 2), A(5, 1)) 
list map(_.x) mkString(",") 

>> res0: String = 2,4,5 

二:

case class B(z: Int) 
case class A(x: Int, y: Int, bs: List[B]) 

val list = List(
    A(2, 3, List(B(4), B(2))), 
    A(4, 2, List()), 
    A(5, 1, List(B(3)))) 

list.map(e => List(e.x) ++ e.bs.map(_.z).take(1)) 
    .map(_.mkString(":")) 
    .mkString(", ") 

>> res0: String = 2:4, 4, 5:3 

我希望幫助。