1. 程式人生 > >go語言-使用“範型”interface進行排序

go語言-使用“範型”interface進行排序

在進入泛型的話題之前, 首先實現對int slice(可以看做int陣列)的氣泡排序:

func BubbleSort(array []int) {
    for i := 0; i < len(array); i++ {
        for j := 0; j < len(array)-i-1; j++ {
            if array[j] > array[j+1] {
                // 交換
                array[j], array[j+1] = array[j+1], array[j]
            }
        }
    }
}
  

如你所見, 上面的程式碼僅適用於對int陣列進行排序, 如果想要對string陣列排序, 不得不另寫一個. 

是否可以只寫一個通用的泛型程式, 以便對所有型別的陣列(甚至是任意資料)進行氣泡排序?

 

很遺憾, go不支援java中的標記式泛型. 但是我們可以使用go的interface實現類似的功能.

interface用於定義方法的集合. 在氣泡排序中, 我們可以將排序操作分解成3個方法: Len()方法負責計算長度, Less(i, j)方法負責比較大小, Swap(i, j)方法負責進行交換.

// 定義可排序介面
type Sortable interface {
    Len() int
    Less(int, int) bool
    Swap(int, int)
}

可以說, 任何實現了Sortable介面的資料型別都可進行氣泡排序, 下面是對Bubblesort方法的改造:

func BubbleSortable(arr Sortable) {
    length := arr.Len()
    for i := 0; i < length; i++ {
        for j := i; j < length-i-1; j++ {
            if arr.Less(j, j+1) {
                arr.Swap(j, j+1)
            }
        }
    }
}

BubbleSortable函式可以對所有Sortable型別的資料進行排序. 那麼, 哪些資料是Sortable型別的呢? 很簡單, 那些實現了Len(), Less(i, j), Swap(i, j)方法的資料型別都是Sortable的. 

 

如果想要對int陣列進行氣泡排序, 只需讓int陣列實現以上3個方法即可:

// 定義IntArr型別
type IntArr []int
// 給IntArr提供Len方法
func (arr IntArr) Len() int {
    return len(arr)
}
// 給IntArr提供Less方法
func (arr IntArr) Less(i int, j int) bool {
    return arr[i] < arr[j]
}
// 給IntArr提供Swap方法
func (arr IntArr) Swap(i int, j int) {
    arr[i], arr[j] = arr[j], arr[i]
}
至此, 我們定義了新的型別: IntArr(實際上就是int陣列), 併為IntArr增加了Len, Less, Swap方法.

注意, 在go中, 實現介面不需要像java那樣顯式的說明對某個介面的implements, 只需要為型別提供所有interface中定義的方法即可. 此例中, 我們給IntArr提供了所有Sortable中定義的方法, 所以IntArr已經實現了Sortable介面. 接下來要做的是將IntArr型別的資料傳遞給BubbleSortable函式就可以了:

intarr := IntArr{2, 3, 1, -9, 0}
// 呼叫排序方法
BubbleSortable(intarr)
// 輸出排序之後的資料
fmt.Printf("sorted int arr is: %v\n", intarr)

 

同樣的, 如果想對string陣列進行氣泡排序, 也只需要讓string陣列實現Sortable介面中定義的所有方法:

type StrArr []string
func (arr StrArr) Len() int {
    return len(arr)
}
func (arr StrArr) Less(i int, j int) bool {
    return arr[i] < arr[j]
}
func (arr StrArr) Swap(i int, j int) {
    arr[i], arr[j] = arr[j], arr[i]
}

測試程式碼如下:

strarr := StrArr{"nut", "ape", "elephant", "zoo", "go"}
Bubblesort(strarr)
fmt.Printf("sorted string arr is: %v\n", strarr)

 

現在, 你可以對任意資料進行氣泡排序了, 只需要該型別實現了Len, Less, Swap方法.

本文由本人原創或者翻譯. 歡迎轉載原創文章, 但轉載必須儲存本簽名. 對於翻譯文章, 所有版權屬於原作者, 轉載必須儲存本簽名. from: http://www.cnblogs.com/cool-xing