2012-02-11 66 views
2

現在,我只有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 
} 

是否有任何其他好的方法來做到這一點?

+1

爲什麼不使用你的第一種方式,'sameElements'?我想這不僅僅是因爲它叫'=='是因爲它(必然)是副作用,清空迭代器。 – 2012-02-11 15:49:33

+2

如果您解釋了這些問題,這將有所幫助。 – 2012-02-11 16:22:04

+0

沒有什麼錯,我只是想知道更多的解決方案,用於學習Scala。 – Freewind 2012-02-11 16:50:01

回答

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

我認爲第一個「比較」有一些問題。調用'.length'將清空迭代器。 – Freewind 2012-02-11 16:06:28

+0

有一些編譯錯誤,我已經修復了最後兩個錯誤,但我不知道如何解決第一個錯誤:錯誤的參數數量;預計= 1' – Freewind 2012-02-11 16:17:18

+0

因此,我們可以在其他順序中完成,我將編輯我的文章。感謝您的建議。 – 2012-02-11 16:17:48