我想知道当我想做一些特定于元素的事情时,将元素数组转换为 String 的最佳方法是什么。例如说我有
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))))
我想输出 A 的部分与 B 中的第一个元素相结合,以产生类似:“2:4,”4:”,“5:3”的内容。
有没有办法用 mkString 来实现这一点,还是我在叫错树?
谢谢
德
最佳答案
当然,您可以先映射然后生成字符串:
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
直接执行此操作吗?不,我不这么认为,除非你像这样覆盖 toString
的 A
方法: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
嵌套列表的第一项。关于scala 在操作元素时调用 mkString,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20977229/