在集合中的元素之前丢弃元素的最佳方法

时间:2011-07-29 10:00:58

标签: smalltalk pharo

鉴于任何像'Lorem ipsum dolor sit amet,consectetuer 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

在工作区中进行评估时它回答为nil,但是必须有一个聪明的方法吗?

2 个答案:

答案 0 :(得分:6)

代码:

phrase substrings do: [: word | word = 'sit' ifFalse: [ ... ] ifTrue: [ ^ nil ] ].
找到单词 sit 后,

返回 nil

请注意,Smalltalk中的 ^ 始终从封闭方法返回。它不会突破 do:

试试这个

之前放弃所有单词:

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"

答案 1 :(得分:4)

我会选择亚历山大的第一个答案:

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.

另外,如果找不到'sit',你必须决定该怎么做。