1

给定任何像'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

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

4

2 回答 2

6

编码:

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

当找到单词sat时返回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"
于 2011-07-29T11:00:18.663 回答
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.

此外,如果找不到“坐”,您必须决定该怎么做。

于 2011-07-29T12:02:53.397 回答