Лучший способ отменить элементы перед элементом в коллекции - PullRequest
1 голос
/ 29 июля 2011

Учитывая любую Струну, такую ​​как «Lorem Ipsum Dolor Sit Amet, Concetetuer Adipiscing Elit», я хотел бы отбросить каждое слово перед сит. Я проверил методы в String, но не нашел очень полезными для этого. Это моя попытка:

| phrase newPhrase |
phrase := 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit'.
newPhrase := phrase substrings.
phrase substrings do: [: word | word = 'sit' ifFalse: [ newPhrase := newPhrase allButFirst ] ifTrue: [ ^ nil ] ].
newPhrase joinUsing: String space

он отвечает на ноль при оценке в рабочей области, и, тем не менее, должен быть разумный способ, верно?

Ответы [ 2 ]

6 голосов
/ 29 июля 2011

Код:

phrase substrings do: [: word | word = 'sit' ifFalse: [ ... ] ifTrue: [ ^ nil ] ].

возвращает ноль , когда найдено слово sit .

Обратите внимание, что ^ в Smalltalk всегда возвращаются из метода включения.Это не разрыв из do:.

Попробуйте вместо этого

Отменить все слова до sit :

words := phrase substrings.
newPhrase := words allButFirst: (words indexOf: 'sit') - 1

Вы также можете найти эти методы сбора интересными:

words copyAfter: 'sit'      "all words after sit"
words copyUpTo: 'sit'       "all words before sit"
words copyUpThrough: 'sit'  "words before and including sit"
4 голосов
/ 29 июля 2011

Я бы пошел с первым ответом Александра:

words := phrase substrings.
newPhrase := words copyAfter: 'sit'

Кажется, что больше намерения (то есть ясно), чем любое из следующего, но просто для забавы, есть два других способа:

Если после профилирования вы хотели повысить эффективность.Этот способ в 25 раз более эффективен:

sitStart := phrase findWordStart: 'sit' startingAt: 1.
afterSit := sitStart + 4.
phrase copyFrom: afterSit to: phrase size.

PetitParser: в 10 раз менее эффективен, но отличный инструмент, который можно иметь в кармане в более сложных ситуациях анализа:

sit := 'sit' asParser.
partToKeep := sit negate plus, sit, #any asParser plus flatten trim ==> [ :n | n third ].
partToKeep parse: phrase.

Кроме того,Вы должны решить, что делать, если «сидеть» не найдено.

...