2016-07-31 9 views
2

:이죠/스몰 토크에서 블록 배열을 정렬 내가 이해할 수없는 블록과 <code>#sort:</code>를 사용 스몰 토크에서 질문이

ArrayedCollection » sort: aSortBlock 
    "Sort this array using aSortBlock for comparing elements. 
    The block should take two arguments and return true if the 
    first element should preceed the second one. 
    If aSortBlock is nil then <= is used for comparison." 
    Self mergeSortFrom: 1 
    to: self size 
    by: aSortBlock 

의 결과가 될 것입니다 무엇 :

| a b | 
a := 10. 
b := [:c :d | (c > a and: [d > a]) ifTrue: [c >= d] ifFalse: [c <= d]]. 
#(17 1 15 6 10 3 7 11 12 4) sort:b 

단계별로 자세히 설명해 주실 수 있습니까?
처음에 c = 17d = 1?
둘 다 a (10)보다 크지 않으므로 블록이 c <= d을 반환합니까?
다음에 어떤 일이 발생합니까? 배열이 실제로 정렬되는 방법은 무엇입니까?

+2

숙제 문제입니까? – Tobias

+1

디버거에서 단계별 실행을 시도 했습니까? 모든 변수에 대해 가장 쉽게 이해할 수 있습니다. 이러한 변수의 이름을 'a'에서 'd'로 지정하면 실용적인 예제보다는 숙제와 같이 스몰 토크 -y (예, 단어)가 아닌 것처럼 보입니다. –

+0

집에서하는 일이 아닙니다. 이전 시험의 샘플입니다. 논리를 설명해 주시겠습니까? 그냥 시작 부분이 필요합니다 .... – user3132295

답변

3

의견에서 제안한대로 #sort: 메서드를 디버깅하여 단계적으로 작동하는지 확인할 수 있습니다. 그것은 참으로 훌륭한 연습이며, 또한 그렇게하는 것이 좋습니다.

그러나 처음에는 코드의 의도를 명확하게 표현하고 (2) 몇 가지 단위 테스트를 작성하여 코드가 의도와 일치하는지 확인해야합니다. 자, 그렇게 해보자! 이 경우

의도가 정렬 블록 캡처 :

당신 의도를 밝혀

(c> a 및 [D> A]) ifTrue : C> = D] 10 정렬 D 위에있는

c 두 경우 d :에 상당 [< C = D]

: ifFalse

당신은 이미 샘플을 제공하지만, 이제

testAllAbove10 
    self assert: (#(17 11 15 12) sort: b) = #(17 15 12 11) 

testAllBelow10 
    self assert: (#(1 6 10 3) sort: b) = #(1 3 6 10) 

testMixed 
    self 
    assert: (#(17 1 15 6 10 3 7 11 12 4) sort: b) = #(1 3 4 6 7 10 17 15 12 11) 

당신이 지금 어떻게 볼 수 #sort: 방법을 디버깅해야 먼저 몇 가지 간단한을 추가 할 수 있습니다 : 다른 종류의 몇 가지 테스트 쓰기

오름차순 escending 공장? 네, 지금 디버거를 시험해 볼 수 있습니다. 그러나이 경우에는 책이나 온라인 소스에서 정렬 알고리즘을 연구하는 것이 중요합니다. 일단 이론을 분명히하고 나면 테스트로 돌아와 디버깅하십시오. 이 모든 단계를 따르면 코드를 실제로 이해할 수 있습니다. 적어도, 이것은 좋은 프로그래머가하는 일입니다.