擴展迭代器可能比你實際需要做的更多的工作。讓我們回滾一下。
你已經有了類的一些狀態的對象MyAlgorithm1
val alg1 = new MyAlgorithm1(args)
現在要反覆調用它的一些功能,這將改變它的狀態,並返回一定的價值。這最好不是通過讓對象實現迭代器來建模,而是通過創建一個處理迭代的新對象。可能是Scala標準庫中最簡單的一個是Stream。這是一個可以從你的算法創建結果流的對象。
val alg1Stream:Stream[Step] = Stream.continually(alg1.next())
現在,如果你想獲得多次從該流的結果,這將是那麼容易,因爲
for(step<-alg1Stream){
// do something
}
或等價
alg1Stream.forEach{
//do something
}
現在假設我們也封裝myAlgorithm2爲流
val alg2=new MyAlgorithm2(args)
val alg2Stream:Stream[Step] = Stream.continually(alg2.next())
然後,我們只是需要一些方法來交織流,然後我們可以說
for(step<-interleave(alg1Stream, algStream2)){
// do something
}
可悲的是,通過標準庫中快速瀏覽,顯示沒有流交織功能。易足夠寫一個
def interleave[A](stream1:Stream[A], stream2:Stream[A]):Stream[A] ={
var str1 = stream1
var str2 = stream2
var streamToUse = 1
Stream.continually{
if(streamToUse == 1){
streamToUse = 2
val out = str1.head
str1 = str1.tail
out
}else{
streamToUse = 1
val out = str2.head
str2 = str1.tail
out
}
}
}
對構造交替反覆兩股之間,從適當的一個獲取下一個結果,然後下次提取設置它的狀態流。請注意,這種交錯只適用於無限流,我們需要一個更聰明的處理可能結束的流,但這對問題的好處很好。
如果你嘗試要更具體地說明你想做什麼,我們可能會想出一個有用的答案。 – mkneissl 2010-06-27 19:23:21
mkneissl,我希望更好地解釋 – barroco 2010-06-27 19:44:16
isola009,我不明白你想如何將MyAlg1加入MyAlg2。您是否將第一個算法的結果傳遞給第二個算法的輸入或反之亦然或交錯結果? – 2010-06-28 03:22:20