迭代Scala包装列表

时间:2011-05-22 14:20:15

标签: list scala iterator wrapper scala-collections

我需要将一个列表封装在Scala中的一个单独的Object中,作为我的集合的包装类。我需要这个来实现一些方法来处理列表(详细地说,我需要在List中找到与列表中其他对象相关联的对象)。

首先是我的代码:

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)

这对我来说看起来有点难看,但我无法弄清楚如何实现一个迭代可以多次迭代集合的迭代器。

另一种只使用普通列表的方法是定义一个函数,该函数使用fold来缩小列表,只保存我想要的对象。

您认为更常见的方式是什么? 过滤到单独的列表,只需保存所需的对象或使用迭代器。 在我看来,从软件设计的角度来看,将我的Axons集合封装在一个单独的对象中会更加清晰。

您认为最适合此问题的是什么?

(如果你问自己我在做什么,轴突是什么;它是神经网络http://en.wikipedia.org/wiki/Neural_network的一部分,Axons集合包裹源和目标神经元之间的连接)

感谢和亲切的问候

=============================================== ==

Felix的解决方案

object Axons extends Traversable[Axon] {
    var axonList=List[Axon]();
    def init(al: List[Axon]) {
        axonList= al;
    }
    def reverse(): List[Axon]  = axonList.reverse
    def get(count: Int) = axonList(count)

        //look here!
    def foreach[U](f: Axon=> U): Unit = axonList.foreach(f)
    //end ... 
    def length(): Int = axonList.length
    def findAxonsBySource(sourceNeuron: Neuron): List[Axon] = {
        axonList collect { 
            case axon: Axon if axon.getSourceNeuron == sourceNeuron  => axon 
            }
    }
}

2 个答案:

答案 0 :(得分:3)

我不确定:

for (axon <- axons.getList)

编译。你的意思是把Axons放在大写的右边吗?

无论如何,你可以这样做:

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的功能方面是减少锅炉板代码的礼物。

答案 1 :(得分:3)

如果您的目标是能够在列表推导中使用Axons,那么您只需要在其中实施mapflatMapwithFilter方法,并且您的情况)将这些来电委托给axonList。完成此操作后,您可以像这样使用axons

for (axon <- axons)

您可以在此SO答案中找到更多信息:

Mock for comprehension in scala