質問

So Im trying to skip past every other element and enter them into a collection. I am then converting the collection back to an array and trying to return it. Im not sure whats wrong though.

altElement

    | newColl x y |
    newColl:= OrderedCollection new.

          x := 1.
          [x <= self size ] whileTrue: [x := x + 2 |
        newColl add: (self at: x)].

        y:= newColl asArray.

        ^y
役に立ちましたか?

解決

Another, more cross dialect variant, is to remember that intervals are collections too (I find this more functional as well).

| sequence |
sequence = #('I' 'invented' 'the' 'term' 'Object' 'Oriented' 'Programming' 'and' 'this' 'is' 'not' 'it').
(1 to: sequence size by: 2) collect: [:n | sequence at: n]

will return:

#('I' 'the' 'Object' 'Programming' 'this' 'not')

But can be easily changed to return

#('invented' 'term' 'Oriented' 'and' 'is' 'it')

by simply swapping the leading 1 for a 2. What's nice though, is that you can slice it any way you want. If your dialect has a pairsCollect:, you can only use it for adjacent items. You can't get every third word starting two from the back in backwards order:

(sequence size - 1 to: 1 by: -3) collect: [:n | sequence at: n]
"returns"
#('not' 'and' 'Object' 'invented')

I find that using the sequence as a slice iterator to collect: is a far more useful and general pattern to use.

他のヒント

You probably want #pairsDo: or even #pairsCollect:.

#(1 2 3 4 5 6 7) pairsCollect: [:a :b | b]. "=> #(2 4 6)"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top