簡體   English   中英

在Squeak / Smalltalk中用塊對數組進行排序

[英]Sorting an array with a block in Squeak/Smalltalk

我在Smalltalk中使用#sort:有一個我無法理解的代碼塊:

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嗎?
接下來發生什么? 數組實際上是如何排序的?

如注釋中所建議,您可以調試#sort:方法以逐步查看它的工作。 這確實是一個好習慣,我也建議您這樣做。

但是,如果您先做另外兩件事,調試會更容易:(1)清楚地表達代碼的意圖,(2)編寫一些單元測試以確保您的代碼符合意圖。 所以,讓我們開始吧!

顯示您的意圖:

在這種情況下,意圖被捕獲在排序塊中:

(c> a和:[d> a])ifTrue:[c> = d] ifFalse:[c <= d]

對應於:

如果cd都在10以上,則按降序排序,否則按升序排序

編寫一些測試:

您已經提供了一個示例,但讓我們先添加一些更簡單的示例

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:方法以查看其工作原理嗎? 好吧,是的,您可以在此時嘗試調試器。 但是,在這種情況下,您仍然需要做第三件事:從書籍或在線資源中學習排序算法。 弄清理論之后,請返回測試並調試它們。 通過遵循所有這些步驟,您將能夠真正理解您的代碼。 至少,這是優秀的程序員所做的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM