用反射实现二维数组key-value排序

海雲_2d72 · · 451 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

首先了解一下概念:

反射是用来检测存储在接口变量内部(值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)

        }

    }

}

```


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:海雲_2d72

查看原文:用反射实现二维数组key-value排序

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:701969077

451 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传