Как сравнить два итератора в Scala? - PullRequest
2 голосов
/ 11 февраля 2012

Пока у меня есть только 3 способа сравнить два итератора (с типом String) в 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
}

Есть ли другие хорошие способы сделать это?

1 Ответ

3 голосов
/ 11 февраля 2012

Я бы использовал 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
  !hasNext && !that.hasNext
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...