【问题标题】:How to compare two iterators in scala?如何比较scala中的两个迭代器?
【发布时间】:2012-03-03 16:46:21
【问题描述】:

目前,我只有 3 种方法来比较 scala 中的两个迭代器(字符串类型):

// 1.
it1 sameElements it2

// 2.
it2.toList == it2.toList

// 3. 
def compare(it1:Iterator[String], it2:Iterator[String]) {
  while (it1.hasNext) {
    if (!it2.hasNext) return false
    if (it1.next != it2.next) {
      return false
    }
  }
  return !it2.hasNext
}

还有其他好的方法吗?

【问题讨论】:

  • 为什么不使用你的第一种方式,sameElements?我想这不只是被称为== 的原因是因为它(必然)有副作用,清空迭代器。
  • 如果你解释了这些有什么问题,那会有所帮助。
  • 没有错,我只是想知道尽可能多的解决方案,用于学习scala。

标签: scala iterator comparison


【解决方案1】:

我会使用 zip:

def compare(it1:Iterator[String], it2:Iterator[String]) = {
  it1.zip(it2).forall(x => x._1 == x._2) && 
  (it1.length == it2.length)    
}

或者你也可以使用尾递归:

def compare(it1:Iterator[String], it2:Iterator[String]) : Boolean = {
  (it1 hasNext, it2 hasNext) match{
    case (true, true) => (it1.next == it2.next) && compare(it1, it2)
    case (false, false) => true
    case _ => false
  }
}

sameElements 使用的函数,我推荐它在 API 中使用,我修改了source 签名以提高可读性

def compare(it1:Iterator[String], it2:Iterator[String]) = {
  while (it1.hasNext && it2.hasNext)
    if (it1.next != it2.next) return false
  !hasNext && !that.hasNext
}

【讨论】:

  • 我认为第一个compare 有一些问题。调用 .length 将清空迭代器。
  • 编译有一些错误,我已经修复了最后两个,但是我不知道如何修复第一个:wrong number of parameters; expected = 1
  • 所以我们可以按其他顺序进行,我将编辑我的帖子。感谢您的建议。
  • 对于我纠正的第一种方法,它不喜欢有 2 个参数的事实。
【解决方案2】:

使用canEqual:

@annotation.tailrec
def compare(it1:Iterator[String], it2:Iterator[String]) : Boolean = {
  Try(it1.next()).canEqual(Try(it2.next())) && compare(it1, it2)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 2021-12-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 2017-04-29
    • 2011-07-20
    • 2020-04-10
    相关资源
    最近更新 更多