2009-10-01 46 views
1

對不起,沒有描述性的標題;我想不出任何更好的東西。編輯它,如果你想到一個。如何在Scala中做這樣的事情?

比方說,我有兩個List對象,他們總是在變化。他們需要保持單獨的列表,但許多操作都必須在他們兩個上完成。這使我做的東西,如:

//assuming A and B are the lists 
A.foo(params) 
B.foo(params) 

換句話說,我做在我的代碼,很多地方完全一樣的操作,以兩種不同的列表。我想要一種方法將它們減少到一個列表,而不必明確地構造另一個列表。我知道只是將列表Ab組合成一個列表C可以解決我所有的問題,但是如果我需要向列表中添加一個新對象,我們會回到相同的操作(因爲我必須添加它到C以及其各自的列表)。

它處於緊密的循環中,性能非常重要。有沒有什麼辦法來構建一個迭代器或者什麼東西來迭代A,然後轉向B,全部透明?我知道另一個解決方案是構建組合列表(C),每次我想在這兩個列表上執行某種功能時,但這會浪費大量時間(從計算角度而言)。

回答

4

的Iterator是什麼您這裏需要。將列表轉換爲迭代器並連接2個迭代器都是O(1)操作。

scala> val l1 = List(1, 2, 3) 
l1: List[Int] = List(1, 2, 3) 

scala> val l2 = List(4, 5, 6) 
l2: List[Int] = List(4, 5, 6) 

scala> (l1.iterator ++ l2.iterator) foreach (println(_)) // use List.elements for Scala 2.7.* 
1 
2 
3 
4 
5 
6 
+0

微調。獲取迭代器:(l1.elements ++ l2.elements)。儘管如此,Iterator解決方案不能與可變列表一起使用,因爲OP顯然需要。另外,Scala庫中的迭代器似乎只能一次性使用。您不能倒帶並重​​復使用它。然而,upvoting的原因,迭代器是去這裏的方式,但可能不是scala庫版本。 – HRJ 2009-10-01 09:47:05

+0

這很好,謝謝。我確實使用HRJ的想法(元素)。 – ryeguy 2009-10-01 12:49:23

+1

@HRJ @ryeguy這就是爲什麼在foreach語句後面的註釋;-) List.elements在Scala 2.8.0中已棄用,請改用iterator。 – 2009-10-01 13:40:57

2

我不知道我是否明白你的意思。 無論如何,這是我的解決方案:

scala> var listA :List[Int] = Nil 
listA: List[Int] = List() 

scala> var listB :List[Int] = Nil 
listB: List[Int] = List() 

scala> def dealWith(op : List[Int] => Unit){ op(listA); op(listB) } 
dealWith: ((List[Int]) => Unit)Unit 

,然後,如果你想在這兩個和listA的執行數組listB一個運營商,您可以像使用下列內容:

scala> listA ::= 1 
scala> listB ::= 0 
scala> dealWith{ _ foreach println } 
1 
0 
相關問題