如何比较scala中的两个迭代器?

发布于 2025-01-04 10:04:53 字数 358 浏览 1 评论 0原文

目前,我只有 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
}

还有其他好的方法吗?

For now, I have only 3 way to compare two iterators (with String type) in 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
}

Is there any other good ways to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

苦行僧 2025-01-11 10:04:53

我会使用 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 中使用,我修改了 来源 签名以提高可读性

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

I would use zip:

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

Or you can also use tail recursion:

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
  }
}

The function used for sameElements, which I recommend as it is used in the API, I modified the source signature for readability

def compare(it1:Iterator[String], it2:Iterator[String]) = {
  while (it1.hasNext && it2.hasNext)
    if (it1.next != it2.next) return false
  !it1.hasNext && !it2.hasNext
}
篱下浅笙歌 2025-01-11 10:04:53

使用 canEqual< /a>:

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

Use canEqual :

@annotation.tailrec
def compare(it1:Iterator[String], it2:Iterator[String]) : Boolean = {
  Try(it1.next()).canEqual(Try(it2.next())) && compare(it1, it2)
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文