【问题标题】:Scala - fold - List of tuples (Long, String) to List of Strings to single StringScala - 折叠 - 元组列表(长,字符串)到字符串列表到单个字符串
【发布时间】:2019-07-22 14:33:09
【问题描述】:

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

我有一个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")

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

【问题讨论】:

    标签: scala fold


    【解决方案1】:

    试试

    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
    

    【讨论】:

    • 会在字符串中包含索引吗?
    • (row, column) 在这种情况下是一个位置。我想要一个索引以及行和列,以便用户知道他们正在查找的位置。
    • 我可以建议 'zipWithIndex' 吗?
    【解决方案2】:

    您不需要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。发现它更清楚!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-07
      • 2015-09-11
      • 2022-11-21
      • 1970-01-01
      • 2017-08-29
      • 2013-09-04
      相关资源
      最近更新 更多