2011-07-29 3 views
1

'Lorem ipsum dolor sitet, 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 

작업 공간에서 평가할 때 응답이 없지만 영리한 방법이 있어야합니다.

답변

6

코드 :

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

반환 전무 단어 앉아 발견된다.

스몰 토크의 ^은 항상 둘러싸는 방식에서 돌아옵니다. do:으로 나뉩니다.

words copyAfter: 'sit'  "all words after sit" 
words copyUpTo: 'sit'  "all words before sit" 
words copyUpThrough: 'sit' "words before and including sit" 
+0

매우 유용합니다. 감사합니다. – user869097

4

나는 알렉산더의 첫 번째 대답과 함께 갈 것입니다 : 당신은 또한 흥미 이러한 수집 방법을 찾을 수 있습니다

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

:

앉아 전에 대신

모든 단어를 삭제하기 위해이 시도 :

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. 

, 당신은 결정해야 '앉다'가 발견되지 않으면 어떻게해야할까요?

+0

'#findWordStart : startingAt :'는 단어가 아니라 start *라는 단어를 찾습니다. 즉'findWordStart : 's ''은 여전히 ​​"앉아"찾을 것입니다. –

+0

예. 이전 단어가 $ s로 시작되면 거짓 긍정을 얻습니다. 예 : ('Lorem sipsum dolle sitemet, consectetuer adipiscing elit'findWordStart : 's'startingAt : 1) "7"을 반환하지만 ('Lorem sipsum dolle sitemet, consectetuer adipiscing elit'findWordStart : 'sitting'startingAt : 1) "반환 20 ". –

+1

예. 아니면 다른 단어가 그 문제에 대해 '앉아'시작했다면 –

관련 문제