2012-04-24 4 views
1

배열의 하위 클래스를 만들고 지금까지 잘 수행 된 일부 메시지를 작성했습니다.Squeak 문자열 배열 및 반복

startString: charToTest 
"Returns a list of all the words that start with a given character" 
| toReturn i j numWords | 
i:= 1. 
j:= 1. 
numWords := 0. 
[i <= self size.] whileTrue: [ 
    (((self at: i) at: 1) = charToTest) 
     ifTrue: [numWords := numWords + 1]. 
    i:= i+1. 
]. 
toReturn := MyArray new: numWords. 
i := 1. 
[i <= numWords.] whileTrue: [ 
    (((self at: i) at: 1) = charToTest) 
     ifTrue: [toReturn at: j put: (self at: i). j := j+1]. 
    i := i + 1. 
]. 
^toReturn 

그래서, 본질적으로,이 방법 자체를 살펴보고 새로운 배열로 시작하는 단어의 수의 크기를 만듭니다 그러나, 나는 지금 여기 내 코드의 본문의 마지막 메시지에 문제가있어 캐릭터. 그런 다음 다시 반복하여이 단어를 새로운 배열로 변환하여 반환합니다. 내 작업 공간은 정확히 다음과 같습니다

|freshArray testArray| 
freshArray := MyArray new: 5. 
freshArray 
    at: 1 put: 'some'; 
    at: 2 put: 'things'; 
    at: 3 put: 'are'; 
    at: 4 put: 'simple'; 
    at: 5 put: 'things'. 
testArray := freshArray startString: $s 

내 작업 영역에서이 코드를 선택하여 인쇄 할 때 방법은 거의 올바른 입니다. 그러나 아주. 어떤 이유로 "toReturn"의 두 번째 슬롯이 채워지지 않습니다. 출력은 다음과 같습니다.

a MyArray('some' nil) 

왜 이런 현상이 발생합니까? if 문 다음에 두 번째 반복 루프에서 내 문장을 올바르게 구분합니까? 나는 내가 잘못한 것을 진정으로 혼란스러워합니다. 어떤 도움을 주시면 감사하겠습니다!

답변

1

첫 번째 반복은 주어진 문자로 시작하는 단어의 수를 계산합니다 (문자열은 비어 있지 않다고 가정하지만 나중에 잘 확인할 수 있음). 여태까지는 그런대로 잘됐다. 두 번째로이 숫자 (numWords)를 사용하여 배열을 다시 반복합니다. 즉, 초기 배열의 첫 번째 'numWords'슬롯에있는 단어 만 고려됩니다.

는 (당신은 또한 DO와 그런데 대체 고려할 수 있습니다 : aBlock - 그 훨씬 덜 지저분 더 스몰 토크 - y를) 우리는보다 컴팩트 한 형태를 사용하는 경향이

+0

이것은 정확한 답변입니다. 제 생각에는 do를 사용하는 것이 맞다고 생각합니다 : 루프도 마찬가지입니다. 돌아가서 다른 반복을 변경하여 클리너를 만들어 보겠습니다. 다시 한 번 고마워, 나는 나 자신을 알아 차리지 못했다고 믿을 수 없다. – Ryanman

1

:

testArray := freshArray select: [:each | charToTest = each first ] 

있습니다 입력에 빈 문자열이 있으면이 작업이 실패합니다.