2013-04-26 3 views
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 
+0

Часть блока между ** [** и ** | ** зарезервирована для аргументов, передаваемых в блок. Кроме того, сообщение 'whileTrue:' оно ожидает блок, который не принимает аргументов. Выражение 'x: = x + 2' принадлежит правую часть ** **. Затем подумайте о том, в каком порядке вы используете ** x ** в качестве индекса и приращения ** x **. Возможно ли, что ** x ** будет превышать размер вашей коллекции до сообщения 'self at: x'? –

ответ

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. Что приятно, так это то, что вы можете нарезать его любым способом. Если на вашем диалекте есть параCollect :, вы можете использовать его только для смежных элементов. Вы не можете получить каждое третье слово, начиная два сзади в обратном порядке:

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

Я считаю, что с помощью последовательности в качестве среза итератора для collect: является гораздо более полезной и общей схемой использования.

4

Вы, вероятно, хотите #pairsDo: или даже #pairsCollect:.

#(1 2 3 4 5 6 7) pairsCollect: [:a :b | b]. "=> #(2 4 6)"