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换成2. 不过,很好的是,您可以按照自己的意愿对其进行切片。如果你的方言有pairCollect:,你只能将它用于相邻的项目。您不能以倒序的顺序从后面开始每三个单词:

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

我发现使用序列作为切片迭代器collect:是一种更有用和更通用的模式。

于 2013-04-26T05:48:17.377 回答