【问题标题】:Iterator to add a counter to repeated lines in a file迭代器为文件中的重复行添加一个计数器
【发布时间】:2020-05-01 08:47:53
【问题描述】:

假设我正在编写一个函数Iterator[String] => Iterator[String] 来将计数器附加到相邻的“重复”字符串,如下所示:

def foo(it: Iterator[String]): Iterator[String] = ???
foo(Iterator("a", "a", "b", "a", "a", "a", "c", "a")) // ("a", "a1", "b", "a", "a1", "a2", "c", "a")

我正在编写一个函数来对所有相邻的重复项进行分组(如在运行长度编码中)groupRepeated: Iterator[String] => Iterator[List[String]],然后我可以简单地编写foo

现在我想知道是否有更简单的解决方案。你有什么建议?

附:我更喜欢使用TraversableOnce 而不是Iterator 的解决方案。

【问题讨论】:

    标签: string scala iterator


    【解决方案1】:

    这个怎么样?

    def foo(it: Iterator[String]): Iterator[String] =
      new Iterator[String] {
        var currentElement: String = _
        var currentCount: Int = _
    
        override def hasNext: Boolean = it.hasNext
    
        override def next(): String = {
          val elem = it.next()
    
          if (elem == currentElement) {
            currentCount += 1
    
            s"${currentElement}${currentCount}"
          } else {
            currentElement = elem
            currentCount = 0
    
            elem
          }
        }
      }
    

    按预期工作:

    foo(List("a", "a", "a", "b", "a", "a", "b", "b", "c").iterator).toList 
    // res: List[String] = List("a", "a1", "a2", "b", "a", "a1", "b", "b1", "c") 
    

    【讨论】:

    • 谢谢。它很好但“非功能性”,因为它使用可变状态。我想我的解决方案更“实用”。
    • 现在我想我更喜欢函数TraversableOnce[String] => TraversableOnce[String]。我会更新问题。
    • @Michael 我要说的主要是意见,但一般来说,内部可变状态在函数式编程中是可以的,因为对于调用者来说,函数仍然是纯的。此外,无论如何,如果你有一个 iterator 你已经有一个可变引用。
    • 我同意迭代器首先是可变的。这就是为什么我认为TraversableOnce 会更好。无论如何,您的解决方案可能比我的更简单。谢谢你的努力!
    • @Michael 我修正了我的答案。对于通用版本,您需要深入研究来自标准库 (仍然相当“可变”) 或某些状态单子的 CanBuildFrom 内容。跨度>
    【解决方案2】:

    应该这样做:

    it.scanLeft (("", "", 0)) { 
     case ((pref, last, count), next) if next == pref => (pref, next + (count+1), count+1) 
     case (_, next) => (next, next, 0) 
    }.drop(1)
     .map(_._2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-20
      • 1970-01-01
      • 2015-06-09
      • 2020-04-11
      • 2018-09-23
      • 2012-03-23
      • 2020-05-18
      • 2014-12-12
      相关资源
      最近更新 更多