我需要将一个列表封装在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
}
}
}
答案 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
,那么您只需要在其中实施map
,flatMap
,withFilter
方法,并且您的情况)将这些来电委托给axonList
。完成此操作后,您可以像这样使用axons
:
for (axon <- axons)
您可以在此SO答案中找到更多信息: