scala在操作元素时调用mkString

时间:2014-01-07 16:47:57

标签: scala

我想知道将元素数组转换为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

2 个答案:

答案 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

我希望有所帮助。