我想知道将元素数组转换为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实现这个目标,还是我咆哮错误的树?
由于 DES
答案 0 :(得分: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
直接做到这一点吗?不,我不相信,除非你覆盖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
的嵌套列表的第一项。
答案 1 :(得分: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
我希望有所帮助。