scala 在操作元素时调用 mkString

标签 scala

我想知道当我想做一些特定于元素的事情时,将元素数组转换为字符串的最佳方法是什么。例如说我有

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来做到这一点吗?不,我不这么认为,除非您像这样覆盖 AtoString 方法:

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

对于嵌套列表

您必须在取消申请方面发挥更多创意:

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/

相关文章:

scala - 为什么 Scala 的不可变 Set 在其类型上不是协变的?

scala - 在 Scala 中有一个 'empty' 的 case 语句是什么意思?

scala - 在 Mavericks 上安装 Play 框架,java 1.8.0_05

mongodb - Mongo-Scala-Driver:CodecConfigurationException:找不到类 immutable.Document 的编解码器

java - Spring MVC - 将模型发送到 View 并返回到 Controller

scala - 在延续中推断结果类型

Scala/Spark 数据帧 : join rows to get a pair within itself

scala - Scala是否有更好的表达“ self 递归泛型类型”的方法?

scala - Slick 3.0 批量插入返回对象的顺序

python - Scala 中的什么数据结构是 Python 的嵌套字典或 csv?