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

ワークスペースで評価すると nil と答えますが、賢い方法があるはずです。

4

2 に答える 2

6

コード:

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

sitという単語が見つかった場合はnilを返します。

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"
于 2011-07-29T11:00:18.663 に答える
4

私はアレクサンドルの最初の答えに行きます:

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

次のいずれよりも意図を明らかにする (つまり、明確にする) ように見えますが、楽しみのために、他の 2 つの方法を次に示します。

プロファイリング後、さらに効率が必要な場合。この方法は 25 倍効率的です。

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

PetitParser: 効率は 10 分の 1 ですが、より複雑な解析状況ではポケットに入れておくと便利なツールです。

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

また、「sit」が見つからない場合にどうするかを決定する必要があります。

于 2011-07-29T12:02:53.397 に答える