1

そのため、他のすべての要素をスキップしてコレクションに入力しようとしています。次に、コレクションを配列に変換して戻そうとしています。何が悪いのかわからない。

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
4

2 に答える 2

4

あなたはおそらく#pairsDo:、または#pairsCollect:.

#(1 2 3 4 5 6 7) pairsCollect: [:a :b | b]. "=> #(2 4 6)"
于 2013-04-26T04:47:04.993 に答える
4

別の、よりクロスダイアレクトなバリアントは、間隔もコレクションであることを覚えておくことです (これもより機能的だと思います)。

| 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]

戻ります:

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

しかし、簡単に元に戻すことができます

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

1先頭を a に交換するだけ2です。いいのは、好きなようにスライスできることです。方言にpairsCollect:がある場合、隣接するアイテムにのみ使用できます。後ろから 2 つ前の単語から 3 つおきの単語を逆順に取得することはできません。

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

シーケンスをスライス イテレータとして使用するcollect:方が、はるかに便利で一般的なパターンであることがわかりました。

于 2013-04-26T05:48:17.377 に答える