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

时间:2012-02-11 14:24:53

标签: scala iterator comparison

现在,我只有3种方法来比较scala中的两个迭代器(带有String类型):

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

还有其他好办法吗?

2 个答案:

答案 0 :(得分:3)

我会使用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
}

答案 1 :(得分:0)

使用canEqual

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