Scala-折叠-元组列表(长字符串)到单个字符串的字符串列表

时间:2019-07-22 14:33:09

标签: scala fold

基本上想做标题说明的事情。

我有一个List[(Long, String)],其中Long是行号,String是列名。我想将元组列表输出为字符串列表,每个字符串的格式如下:

index : row, column

例如

1: 3, column1

2: 7, column3 ...

然后我想把它压扁

我要在执行此操作时创建索引。因此,我想我会在列表上使用zipWithIndex,然后将其折叠。我仍然不确定折叠。我知道您给它一个初始值,然后递归地返回该初始值和一个运算的乘积(对吗?)。但是,我确实很难理解我将如何做我已经解释过的事情。任何建议/帮助/解释将非常有帮助。

recordList.zipWithIndex.fold(List.empty[(Int, String)]) {
    case (... that record in recordList exists?...) =>
        s"${index.toString} : $row , $column \n" // to be single record in final list
}.mkString(" \n")

很显然,上面的代码不起作用。这只是我想尝试做的一个例子。

2 个答案:

答案 0 :(得分:3)

尝试

recordList
  .zipWithIndex
  .map { case (v, index) => s"$index: ${v._1}, ${v._2}" }
  .mkString("\n")

输出

0: 3, column1
1: 2, column2
2: 7, column3

给予

val recordList: List[(Long, String)] = List((3, "column1"), (2, "column2"), (7, "column3"))

使用foldLeft试试

recordList.foldLeft[(String, Iterator[Int])](("", LazyList.iterate(0)(_ + 1).iterator)) {
  case ((acc, index), v) => s"$acc \n ${index.next}: ${v._1}, ${v._2}" -> index
}._1

答案 1 :(得分:1)

您不需要foldLeft,只需一个简单的map即可:

val l: List[(Long, String)] = List((3L, "col1"), (7L, "col2"))

l.zip(Stream from 1).map{ case (value, index) => s"$index: ${value._1}, ${value._2}" }.mkString("\n")

请注意,我通常更喜欢zip(Stream from 1)而不是zipWithIndex,并在以后手动添加1。找到更清晰的!