用反射實現二維陣列key-value排序
首先了解一下概念:
反射是用來檢測儲存在介面變數內部(值value,型別type) 的一種機制。在Golang的reflect反射包中,提供了兩種型別(或者說兩個方法)讓我們可以很容易的訪問介面變數內容,分別是reflect.ValueOf() 和 reflect.TypeOf():
reflect.TypeOf: 直接給我們想要的type型別,如float64、int、指標、struct 等型別 reflect.ValueOf:直接給我們想要的具體的值,如520具體數值,或者類似&{13 "Hy" 26} 結構體struct的值
具體用法清參考reflect包文件。
快速排序 O(nlog2 n) 最壞O(n^2) 基本思想是:通過一趟排序將要排序的資料分割成獨立的兩部分,其中一部分的所有資料都比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此達到整個資料變成有序序列。
```
xode
````
```
import (
"fmt"
"reflect"
)
type info struct {
name string
sex int
createTime int
}
type User struct {
userID int
playerTime int
playerInfo info
}
func main() {
users := []User{
{
userID: 10,
playerTime: 1539158076,
playerInfo: info{
name: "小明10",
sex: 1,
createTime: 1539158000,
},
},
{
userID: 8,
playerTime: 1539158076,
playerInfo: info{
name: "小明8",
sex: 1,
createTime: 1539158076,
},
},
{
userID: 2,
playerTime: 1539158076,
playerInfo: info{
name: "小明2",
sex: 1,
createTime: 1539158076,
},
},
{
userID: 30,
playerTime: 1539108076,
playerInfo: info{
name: "小明30",
sex: 1,
createTime: 1539108076,
},
},
{
userID: 15,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 15,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 15,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 50,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 20,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 30,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 19,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 13,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
{
userID: 3,
playerTime: 1539150000,
playerInfo: info{
name: "小明15",
sex: 1,
createTime: 1539150000,
},
},
},
}
sortList(users)
fmt.Println(users)
}
func sortList(values []User) {
quickSort(values, 0, len(values)-1, "userID")
}
//根據二維key值 int型排序 升序 快排
func quickSort(values []User, left int, right int, sortName string) {
user := reflect.ValueOf(values[left]) //取出第一項
leftUser := values[left]
key := user.FieldByName(sortName).Int()
p := left
i, j := left, right
for i <= j {
//由後開始向前搜尋(j--),找到第一個小於key的值values[j]
for j >= p && reflect.ValueOf(values[j]).FieldByName(sortName).Int() >= key {
j--
}
//第一個小於key的值 賦給 values[p]
if j >= p {
values[p] = values[j]
p = j
}
if reflect.ValueOf(values[i]).FieldByName(sortName).Int() <= key && i <= p {
i++
}
if i < p {
values[p] = values[i]
p = i
}
values[p] = leftUser
if p-left > 1 {
quickSort(values, left, p-1, sortName)
}
if right-p > 1 {
quickSort(values, p+1, right, sortName)
}
}
}
```