分享
  1. 首页
  2. 文章

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

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

首先了解一下概念:

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

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

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏