Итерация по упакованному списку Scala - PullRequest
0 голосов
/ 22 мая 2011

Мне нужно инкапсулировать список в отдельный объект в 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)

Мне это кажется некрасивым, но я не мог понять, как реализовать итератор, который можно использовать несколько раз для итерации по коллекции.

Другой подход, просто использующий простой список, состоит в том, чтобы определить функцию, которая использует сложение, чтобы уменьшить список, просто удерживая объекты, которые я хочу иметь.

Что вы считаете более распространенным способом? Фильтруйте в отдельный список, просто удерживая нужные объекты или используя итератор. По моему мнению, было бы более понятным заключить мою коллекцию Аксонов в отдельный объект с точки зрения разработки программного обеспечения.

Как вы думаете, что лучше всего подходит для этой проблемы?

(Если вы спросите себя, что я делаю и что такое аксон; это часть нейронной сети http://en.wikipedia.org/wiki/Neural_network, а коллекция Axons обернет связи между исходным и целевым нейроном)

спасибо и всего наилучшего

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

Решение от Феликса

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 ]

3 голосов
/ 22 мая 2011

Если ваша цель состоит в том, чтобы иметь возможность использовать Axons в списках, то вам просто нужно внедрить в него методы map, flatMap, withFilter и (в вашем случае) делегировать эти вызовы axonList. Сделав это, вы можете использовать axons следующим образом:

for (axon <- axons)

Более подробную информацию вы можете найти в этом SO ответе:

Макет для понимания в скале

3 голосов
/ 22 мая 2011

Я не уверен в этом:

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

IЯ не совсем уверен, что правильно понял проблему, но надеюсь, что это поможет:)

edit

Просто некоторые мысли в вашем посте.Хорошая вещь о Scala заключается в том, что вы можете иногда пропустить шаги, которые вы будете вынуждены делать, например, в Java.Не создавайте классы и схемы больших типов для всего, если вы не чувствуете, что это действительно оправдано.Мой подход всегда состоит в том, чтобы свернуть / отобразить / отфильтровать, а что нет, пока я не получу то, что мне нужно для тестирования моего программного обеспечения.Если мне нужно повысить производительность / модульность, я могу начать переделывать части моего программного обеспечения.В основном я получаю короткие программы и редко приходится переделывать вещи.Я рассматриваю функциональный аспект Scala как подарок, позволяющий значительно сократить код котельной плиты.

...