2011-05-22 72 views
0

我需要將一個列表封裝在Scala中的單獨對象中,充當我的集合的包裝類。我需要這個來實現一些方法來處理列表(詳細地說,我需要在列表中找到與列表中的其他對象關聯的對象)。在Scala包裝列表中迭代

所以首先我的所有代碼:

object Axons { 
    var axonList=List[Axon](); 
    var pos=0; 
    def init(al: List[Axon]) { 
     axonList= al; 
    } 
    def reverse(): List[Axon] = axonList.reverse 
    def get(count: Int) = axonList(count) 
    def getList(): List[Axon] = axonList 
    def length(): Int = axonList.length 

} 

現在迭代偏偏喜歡:

for (axon <- axons.getList) 

這看起來有點醜給我,但我無法弄清楚如何實現一個Iterator是可多次使用以迭代集合。

另一種方法,只使用普通列表,是定義一個函數,它使用fold來縮小列表,只是容納我想要擁有的對象。

你認爲更常見的方法是什麼? 過濾到一個單獨的列表只是保存需要的對象或使用迭代器。 在我看來,從軟件設計的角度來看,將我的Axons集合封裝在一個單獨的對象中將會更加乾淨。

你認爲最適合這個問題的是什麼?

(如果你問自己,我在做什麼,什麼軸突是,它的一個神經網絡http://en.wikipedia.org/wiki/Neural_network和軸突收集的部分包裹的來源和目的地神經元之間的連接)

感謝和親切問候

============================================= ====從菲利克斯

解決方案 ​​

回答

3

我不確定這一點:

for (axon <- axons.getList) 

編譯。你打算把阿克森斯大寫字母放在右邊?

無論如何,你可以做這樣的事情:

object Test extends Traversable[Int]{ 
val list = List(1,2,1337,4) 
def foreach[U](f: Int=> U): Unit = list.foreach(f) 
} 

,並測試它像這樣:

Test foreach println 
1 
2 
1337 
4 

我不能完全確定我理解正確的問題,但我希望它能幫助: )

編輯

只是對你的帖子的一些想法。關於Scala的好處在於,您有時可能會跳過您不得不以Java爲例的步驟。除非你覺得這是合理的,否則不要爲所有事情創建類和大型計劃。我的方法總是摺疊/映射/過濾,直到我得到我需要測試我的軟件的東西。如果我需要提高性能/模塊性,我可以開始重做部分軟件。大多數情況下,我得到的是短節目,很少需要重做。 我將Scala的功能方面看作是禮物,以極大地減少鍋爐板代碼。

+0

這是它非常感謝你。 – evildead 2011-05-22 14:47:12

+0

不客氣:) – Felix 2011-05-23 18:04:55

3

如果你的目標是能夠在列表解析使用Axons,那麼你只需要實現它mapflatMapwithFilter方法和(你的情況)委託這些調用到axonList。當你做這個,你可以使用axons這樣的:

for (axon <- axons) 

更多信息,你可以在此找到這麼回答:

Mock for comprehension in scala

+0

好的,明白了。軸突是List [Axon],現在我將Axons作爲對象,所以我可以在我的代碼中使用Axons? – evildead 2011-05-22 14:43:54

+0

@evildead:如果通過「我的代碼」,你的意思是理解,那麼是的 - 用'map','flatMap','withFilter',你可以讓'Axons'類用於理解。但是如果你直接使用了一些列表方法(比如reduce的'foldLeft'),那麼你需要修改你現有的代碼並使用'axons.axonList.foldLeft'等。 – tenshi 2011-05-22 14:49:11