mirror of https://github.com/qwqdanchun/nps.git
42 lines
1.1 KiB
Go
42 lines
1.1 KiB
Go
package file
|
|
|
|
import (
|
|
"reflect"
|
|
"sort"
|
|
"sync"
|
|
)
|
|
|
|
// A data structure to hold a key/value pair.
|
|
type Pair struct {
|
|
key string //sort key
|
|
cId int
|
|
order string
|
|
clientFlow *Flow
|
|
}
|
|
|
|
// A slice of Pairs that implements sort.Interface to sort by Value.
|
|
type PairList []*Pair
|
|
|
|
func (p PairList) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
|
|
func (p PairList) Len() int { return len(p) }
|
|
func (p PairList) Less(i, j int) bool {
|
|
if p[i].order == "desc" {
|
|
return reflect.ValueOf(*p[i].clientFlow).FieldByName(p[i].key).Int() < reflect.ValueOf(*p[j].clientFlow).FieldByName(p[j].key).Int()
|
|
}
|
|
return reflect.ValueOf(*p[i].clientFlow).FieldByName(p[i].key).Int() > reflect.ValueOf(*p[j].clientFlow).FieldByName(p[j].key).Int()
|
|
}
|
|
|
|
// A function to turn a map into a PairList, then sort and return it.
|
|
func sortClientByKey(m sync.Map, sortKey, order string) (res []int) {
|
|
p := make(PairList, 0)
|
|
m.Range(func(key, value interface{}) bool {
|
|
p = append(p, &Pair{sortKey, value.(*Client).Id, order, value.(*Client).Flow})
|
|
return true
|
|
})
|
|
sort.Sort(p)
|
|
for _, v := range p {
|
|
res = append(res, v.cId)
|
|
}
|
|
return
|
|
}
|