feat(Go-Tool):2020/11/16:新增项目案例(按照一定规则对一组数据进行排序分组)

This commit is contained in:
Huangzj
2020-11-16 18:09:28 +08:00
parent 2ac2b2666f
commit 179e5f6a31
10 changed files with 888 additions and 13 deletions
+15 -11
View File
@@ -7,23 +7,27 @@
package main package main
import ( import (
"Go-Tool/util"
"Go-Tool/util/reflectM" "Go-Tool/util/reflectM"
"fmt" "fmt"
"math"
"reflect" "reflect"
) )
func main() { func main() {
fmt.Println(util.Crc32Mode("ewqeqweqw", 4)) //fmt.Println(util.Crc32Mode("ewqeqweqw", 4))
fmt.Println(util.Crc32Mode("sdasdsa", 4)) //fmt.Println(util.Crc32Mode("sdasdsa", 4))
fmt.Println(util.Crc32Mode("dasdsadasdas", 4)) //fmt.Println(util.Crc32Mode("dasdsadasdas", 4))
fmt.Println(util.Crc32Mode("321321312", 4)) //fmt.Println(util.Crc32Mode("321321312", 4))
fmt.Println(util.Crc32Mode("dsadas", 4)) //fmt.Println(util.Crc32Mode("dsadas", 4))
fmt.Println(util.Crc32Mode("dasd23132131", 4)) //fmt.Println(util.Crc32Mode("dasd23132131", 4))
fmt.Println(util.Crc32Mode("eqwewqewqd4312312", 4)) //fmt.Println(util.Crc32Mode("eqwewqewqd4312312", 4))
fmt.Println(util.Crc32Mode("3123213dasdasdas", 4)) //fmt.Println(util.Crc32Mode("3123213dasdasdas", 4))
fmt.Println(util.Crc32Mode("312321dfdsfsdg", 4)) //fmt.Println(util.Crc32Mode("312321dfdsfsdg", 4))
fmt.Println(util.Crc32Mode("ewqrewrqwe", 4)) //fmt.Println(util.Crc32Mode("ewqrewrqwe", 4))
fmt.Println(int(math.Ceil(1.1)))
fmt.Println(int(math.Ceil(1.6)))
fmt.Println(int(math.Floor(1.1)))
fmt.Println(int(math.Floor(1.6)))
//testReflect() //testReflect()
} }
+29
View File
@@ -0,0 +1,29 @@
/*
* @Author : huangzj
* @Time : 2020/11/13 14:55
* @Description
*/
package ProgressTest
import (
"Go-Tool/util/file"
"Go-Tool/util/jsonEnhance"
)
type DeliverList struct {
Deliver []*Deliver
}
type Deliver struct {
Score int
AllScore int
Id int
}
func MakeData() DeliverList {
var deliver DeliverList
content, _ := file.ReadJsonFile("F:\\Go_BySelf\\src\\Go-Tool\\ProgressTest\\deliverData.json")
jsonEnhance.UnmarshalFromString(content, &deliver)
return deliver
}
+140
View File
@@ -0,0 +1,140 @@
/*
* @Author : huangzj
* @Time : 2020/11/16 14:44
* @Description
*/
package ProgressTest
import (
"Go-Tool/util/rand"
"fmt"
"math"
"testing"
)
const (
MinGroupNum = 10
MaxGroupNum = 80
)
//需求(直接举例)
//总共有100个数据,两个变量,大区间(MaxGroupNum) 为80 小区间(MinGroupNum)为 10 || 100 和 80 对应的参数 都必须是10的倍数
//第一步:先100个数据排序,然后按照80进行划分。
//第二步:100划分剩余的数据组成一组
//第三步:80个数组再一次排序,按照 10 * 4 进行划分,可以分成两组
//第四步:40每组的数据,要分成最后的10 * 4 的4组,按照每次取前5再随机取5个组成一组的方式组成4组
//第五步:不足4组的,按照取前5和随机5个的方式进行分组
func TestDeliver2(t *testing.T) {
firstOrderRule = FirstOrderRule
secondOrderRule = SecondOrderRule
thirdOrderRule = ThirdOrderRule
list := MakeData() //创建数据
resultList := deliver2(list.Deliver) //进行分组操作
fmt.Printf(fmt.Sprintf("%v", resultList))
}
func deliver2(delivers []*Deliver) [][]int {
resultList := make([][]int, 0)
newDelivers := make([]*Deliver, 0)
//获得第一次按照大区间分组后剩下的元素数量、第一次分组所有组、分到的大组数量
leaveNum, partitions, partition := FirstOrder(delivers, newDelivers)
resultList = withCompletePartition(partitions, resultList) //对完整的分组进行处理
resultList = withLeavePartition(resultList, newDelivers, leaveNum, partition) //对剩余的分组进行处理
return resultList
}
func withLeavePartition(resultList [][]int, newDelivers []*Deliver, leaveNum int, partition int) [][]int {
if leaveNum != 0 {
leaveList := newDelivers[partition*MaxGroupNum:]
resultList = secondOrder(leaveList, resultList, leaveNum)
}
return resultList
}
func withCompletePartition(partitions [][]*Deliver, resultList [][]int) [][]int {
for _, partition := range partitions {
resultList = secondOrder(partition, resultList, len(partition))
}
return resultList
}
func FirstOrder(delivers []*Deliver, newDelivers []*Deliver) (int, [][]*Deliver, int) {
newDelivers = firstOrderRule(delivers) //第一次排序
partition := len(newDelivers) / MaxGroupNum
leaveNum := len(newDelivers) % MaxGroupNum
partitions := make([][]*Deliver, 0)
for i := 0; i < partition; i++ {
partitions = append(partitions, newDelivers[i*MaxGroupNum:(i+1)*MaxGroupNum])
}
return leaveNum, partitions, partition
}
func secondOrder(delivers []*Deliver, resultList [][]int, listNum int) [][]int {
newDelivers := secondOrderRule(delivers) //第二次排序
if listNum > 4*MinGroupNum {
fourInOne := listNum / (4 * MinGroupNum)
leave := listNum % (4 * MinGroupNum)
for i := 0; i < fourInOne; i++ {
resultList = append(resultList, calculateFourInOne(newDelivers[i*4*MinGroupNum:(i+1)*4*MinGroupNum])...) //四倍在一组的计算
}
if leave != 0 {
resultList = append(resultList, calculateByLeft(toList(newDelivers[fourInOne*4*MinGroupNum:]))...)
}
} else {
resultList = append(resultList, calculateByLeft(toList(newDelivers))...)
}
return resultList
}
func toList(deliver []*Deliver) [][]int {
result := make([][]int, 0)
for _, item := range deliver {
result = append(result, []int{item.Score, 1})
}
return result
}
func calculateFourInOne(delivers []*Deliver) [][]int {
Ids := thirdOrderRule(delivers) //第三次排序
result := calculateByLeft(Ids)
return result
}
func calculateByLeft(leftList [][]int) [][]int {
result := make([][]int, 0)
for len(leftList) != 0 {
newList := make([]int, 0)
thisGroup := getFirstSome(leftList[0 : MinGroupNum/2]) //先拿到前面的几个
leftList = leftList[MinGroupNum/2:]
//然后在随机随取后面的几个
for i := 0; i < int(math.Ceil(MinGroupNum/2)); i++ {
newList, leftList = getFrontAndEnd(leftList) //从前部和后部进行组合数组
thisGroup = append(thisGroup, newList[0])
}
result = append(result, thisGroup)
}
return result
}
func getFirstSome(list [][]int) []int {
result := make([]int, 0)
for _, item := range list {
result = append(result, item[0])
}
return result
}
func getFrontAndEnd(leftList [][]int) ([]int, [][]int) {
return rand.GetAwardByWeightWithLeftAward(leftList)
}
+95
View File
@@ -0,0 +1,95 @@
/*
* @Author : huangzj
* @Time : 2020/11/13 12:00
* @Description:在工程中有一个需求是对 指定数量的数组进行划分,按照每一层的规则分成对应数量,这边做一个测试.
*/
package ProgressTest
import (
"Go-Tool/util/rand"
"fmt"
"github.com/ahmetalpbalkan/go-linq"
"testing"
)
const (
oneGroupNum = 4
)
//
//未完成
//需求:有一组结构体【Deliver】,现在需要按照一定的规则把这么多的结构体划分为每组X个元素多组,假设这边X = 10 (前提是Deliver可以整除10)
// 第一次按照Score排序,把Deliver划分为每组 8 * 10个元素的多个数组,不足80的按照一组算(如果分数相同,按照Id自然数排序)
// 第二次按照Id在每个8 * 10的数组中排序,分成 4 * 10 的两个数组
// 第三次按照AllScore进行排序,把 4 * 10的数组,分成两个2 * 10的数组
// 第四次在2 * 10的数组中获取前10/2,然后随机在剩下的 2 * 10 - 10/2 的数组中随 10/2 个元素和第一个前五组成一组
//
// 在第一次划分中,不满8 * 10的数组,按照数组划分往下计算
//
func TestDeliver(t *testing.T) {
list := MakeData() //创建数据
deliver(list.Deliver) //进行分组操作
}
func deliver(list []*Deliver) {
group := len(list) / (8 * oneGroupNum) //求组数
//lastNum := len(list) % (8*oneGroupNum) //求最后一组的数量(余数),如果为0则说明除得尽,不需要额外操作
query := linq.From(list).OrderByDescending(func(i interface{}) interface{} {
return i.(*Deliver).Score
})
queryList := make([]linq.Query, 0)
queryList2 := make([]linq.Query, 0)
queryList3 := make([]linq.Query, 0)
//第一个步骤:按照Score排序并划分
for i := 0; i < group; i++ {
//每次数组的创建都要先去掉前面的8 * 10个元素,再取此时的8*10个元素作为当前组.因为linq没有对应取区间的方法..
queryList = append(queryList, query.Skip(i*8*oneGroupNum).Take(8*oneGroupNum))
}
//第二个步骤:按照Id排序并划分
for i, item := range queryList {
for j := 0; j < len(queryList[i].Results())/(4*oneGroupNum); j++ {
queryList2 = append(queryList2, item.OrderByDescending(func(result interface{}) interface{} {
return result.(*Deliver).Id
}).Skip(j*4*oneGroupNum).Take(4*oneGroupNum))
}
fmt.Println()
}
//第三个步骤:按照AllScore进行排序并划分
for i, item := range queryList2 {
queryList3 = append(queryList3, item.OrderByDescending(func(i interface{}) interface{} {
return i.(*Deliver).AllScore
}).Skip(i*2*oneGroupNum).Take(2*oneGroupNum))
}
for _, item := range queryList3 {
deliver := make([]*Deliver, 0)
fmt.Println(item.Results())
item.ToSlice(&deliver)
delivers := toIntList(deliver[0 : oneGroupNum/2])
left := toIntList(deliver[oneGroupNum/2:])
for i := 0; i < oneGroupNum/2; i++ {
result := make([]int, 0)
result, left = rand.GetAwardByWeightWithLeftAward(left)
delivers = append(delivers, result)
}
fmt.Println(delivers)
fmt.Println(left)
}
//第四个步骤:排序划分然后进行随机组合.
fmt.Printf("")
}
func toIntList(delivers []*Deliver) [][]int {
list := make([][]int, 0)
for _, item := range delivers {
list = append(list, []int{item.Id, item.AllScore, 1})
}
return list
}
+49
View File
@@ -0,0 +1,49 @@
/*
* @Author : huangzj
* @Time : 2020/11/16 18:00
* @Description
*/
package ProgressTest
import "github.com/ahmetalpbalkan/go-linq"
type orderRule = func([]*Deliver) []*Deliver
type intOrderRule = func([]*Deliver) [][]int
var (
firstOrderRule orderRule
secondOrderRule orderRule
thirdOrderRule intOrderRule
)
func FirstOrderRule(delivers []*Deliver) []*Deliver {
var newDelivers []*Deliver
linq.From(delivers).OrderByDescending(func(d interface{}) interface{} {
return d.(*Deliver).Score
}).ToSlice(&newDelivers)
return newDelivers
}
func SecondOrderRule(delivers []*Deliver) []*Deliver {
newDeliver := make([]*Deliver, 0)
//第二次排序
linq.From(delivers).OrderByDescending(func(d interface{}) interface{} {
return d.(*Deliver).Score
}).ThenBy(func(d interface{}) interface{} {
return d.(*Deliver).Id
}).ToSlice(&newDeliver)
return newDeliver
}
func ThirdOrderRule(delivers []*Deliver) [][]int {
Ids := make([][]int, 0)
//第三次排序
linq.From(delivers).OrderByDescending(func(d interface{}) interface{} {
return d.(*Deliver).Score
}).Select(func(i interface{}) interface{} {
return []int{i.(*Deliver).Score, 1}
}).ToSlice(&Ids)
return Ids
}
+504
View File
@@ -0,0 +1,504 @@
{
"Deliver": [
{
"Score": 1,
"AllScore": 20000,
"Id": 1
},
{
"Score": 23,
"AllScore": 4321423,
"Id": 5
},
{
"Score": 19,
"AllScore": 43214,
"Id": 3
},
{
"Score": 39,
"AllScore": 41324,
"Id": 12
},
{
"Score": 41,
"AllScore": 2314,
"Id": 55
},
{
"Score": 42,
"AllScore": 654,
"Id": 23
},
{
"Score": 49,
"AllScore": 765,
"Id": 16
},
{
"Score": 98,
"AllScore": 7876,
"Id": 57
},
{
"Score": 88,
"AllScore": 8909,
"Id": 77
},
{
"Score": 77,
"AllScore": 4532,
"Id": 89
},
{
"Score": 341,
"AllScore": 356536,
"Id": 24
},
{
"Score": 123,
"AllScore": 67456,
"Id": 19
},
{
"Score": 67,
"AllScore": 8768,
"Id": 31
},
{
"Score": 33,
"AllScore": 457,
"Id": 80
},
{
"Score": 32,
"AllScore": 76,
"Id": 98
},
{
"Score": 43,
"AllScore": 6787,
"Id": 100
},
{
"Score": 45,
"AllScore": 8756,
"Id": 121
},
{
"Score": 89,
"AllScore": 98765,
"Id": 114
},
{
"Score": 55,
"AllScore": 234,
"Id": 117
},
{
"Score": 56,
"AllScore": 8765,
"Id": 135
},
{
"Score": 90,
"AllScore": 345,
"Id": 201
},
{
"Score": 135,
"AllScore": 456543,
"Id": 331
},
{
"Score": 56,
"AllScore": 6354677,
"Id": 156
},
{
"Score": 54,
"AllScore": 8765,
"Id": 178
},
{
"Score": 34,
"AllScore": 42352,
"Id": 891
},
{
"Score": 21,
"AllScore": 24359,
"Id": 444
},
{
"Score": 45,
"AllScore": 8735,
"Id": 333
},
{
"Score": 23,
"AllScore": 68477,
"Id": 251
},
{
"Score": 47,
"AllScore": 847645,
"Id": 1
},
{
"Score": 69,
"AllScore": 76536,
"Id": 1455
},
{
"Score": 67,
"AllScore": 7654352,
"Id": 1871
},
{
"Score": 48,
"AllScore": 36356,
"Id": 1980
},
{
"Score": 47,
"AllScore": 635763,
"Id": 2001
},
{
"Score": 45,
"AllScore": 365436,
"Id": 2100
},
{
"Score": 12,
"AllScore": 63422,
"Id": 2381
},
{
"Score": 16,
"AllScore": 35654,
"Id": 7
},
{
"Score": 14,
"AllScore": 635634,
"Id": 391
},
{
"Score": 12,
"AllScore": 63542,
"Id": 781
},
{
"Score": 11,
"AllScore": 63553,
"Id": 171
},
{
"Score": 99,
"AllScore": 8758768,
"Id": 392
},
{
"Score": 88,
"AllScore": 97658,
"Id": 511
},
{
"Score": 77,
"AllScore": 87576,
"Id": 501
},
{
"Score": 66,
"AllScore": 85675867,
"Id": 1819
},
{
"Score": 55,
"AllScore": 412343,
"Id": 1971
},
{
"Score": 44,
"AllScore": 314232,
"Id": 1333
},
{
"Score": 33,
"AllScore": 3211324,
"Id": 1555
},
{
"Score": 22,
"AllScore": 4132421,
"Id": 2221
},
{
"Score": 43,
"AllScore": 65437,
"Id": 17777
},
{
"Score": 12,
"AllScore": 76444,
"Id": 4411
},
{
"Score": 86,
"AllScore": 8976,
"Id": 5111
},
{
"Score": 55,
"AllScore": 98467,
"Id": 18821
},
{
"Score": 98,
"AllScore": 765265,
"Id": 11771
},
{
"Score": 67,
"AllScore": 54235,
"Id": 15666
},
{
"Score": 78,
"AllScore": 52345,
"Id": 18912
},
{
"Score": 67,
"AllScore": 523452,
"Id": 10912
},
{
"Score": 34,
"AllScore": 523452,
"Id": 18712
},
{
"Score": 12,
"AllScore": 565764,
"Id": 166271
},
{
"Score": 50,
"AllScore": 87654,
"Id": 1909342
},
{
"Score": 36,
"AllScore": 475647,
"Id": 118223
},
{
"Score": 49,
"AllScore": 875658,
"Id": 82178
},
{
"Score": 54,
"AllScore": 857346,
"Id": 341223
},
{
"Score": 21,
"AllScore": 745674,
"Id": 31321
},
{
"Score": 56,
"AllScore": 74674567,
"Id": 98897
},
{
"Score": 12,
"AllScore": 745746,
"Id": 1891
},
{
"Score": 98,
"AllScore": 9879875,
"Id": 103921
},
{
"Score": 64,
"AllScore": 7446,
"Id": 1784671
},
{
"Score": 77,
"AllScore": 456746,
"Id": 1903213
},
{
"Score": 7,
"AllScore": 52345423,
"Id": 19123312
},
{
"Score": 4,
"AllScore": 2543252,
"Id": 1012813
},
{
"Score": 2,
"AllScore": 413243124,
"Id": 167316312
},
{
"Score": 1,
"AllScore": 41324,
"Id": 19321321
},
{
"Score": 12,
"AllScore": 5234,
"Id": 132144
},
{
"Score": 99,
"AllScore": 1234124,
"Id": 13215467
},
{
"Score": 100,
"AllScore": 43214,
"Id": 195342
},
{
"Score": 90,
"AllScore": 43214,
"Id": 1098768634
},
{
"Score": 78,
"AllScore": 43124132,
"Id": 108698
},
{
"Score": 56,
"AllScore": 54325,
"Id": 1098734
},
{
"Score": 89,
"AllScore": 65354,
"Id": 13432112
},
{
"Score": 78,
"AllScore": 63543,
"Id": 1343465
},
{
"Score": 65,
"AllScore": 4676745,
"Id": 17657786
},
{
"Score": 31,
"AllScore": 47647,
"Id": 13542354
},
{
"Score": 55,
"AllScore": 8476545,
"Id": 142365676
},
{
"Score": 31,
"AllScore": 1000,
"Id": 135467
},
{
"Score": 67,
"AllScore": 6357854,
"Id": 1658658
},
{
"Score": 12,
"AllScore": 653535,
"Id": 1523456324
},
{
"Score": 56,
"AllScore": 655462,
"Id": 17654899
},
{
"Score": 12,
"AllScore": 635,
"Id": 10009767
},
{
"Score": 65,
"AllScore": 365342,
"Id": 1568534
},
{
"Score": 55,
"AllScore": 63556,
"Id": 11324136
},
{
"Score": 89,
"AllScore": 63553,
"Id": 108768745
},
{
"Score": 98,
"AllScore": 76245,
"Id": 122213241
},
{
"Score": 87,
"AllScore": 76467,
"Id": 21343441
},
{
"Score": 54,
"AllScore": 76467,
"Id": 43232131
},
{
"Score": 12,
"AllScore": 1000,
"Id": 7654761
},
{
"Score": 45,
"AllScore": 635765,
"Id": 78689231
},
{
"Score": 27,
"AllScore": 635346,
"Id": 987653121
},
{
"Score": 19,
"AllScore": 3653,
"Id": 76321111
},
{
"Score": 54,
"AllScore": 6543,
"Id": 923438321
},
{
"Score": 21,
"AllScore": 543254423,
"Id": 9034241321
},
{
"Score": 18,
"AllScore": 43124321,
"Id": 9432143211
}
]
}
+2
View File
@@ -56,6 +56,8 @@
2020/11/12:新增linq包使用示例(未完成) 2020/11/12:新增linq包使用示例(未完成)
2020/11/16:新增项目案例(按照一定规则对一组数据进行排序分组)
# mod vendor模式加载包 # mod vendor模式加载包
通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到 通过go mod的方式加载的github上面的包会有报红的问题,但是包本身是可以运行的,这样就是会有一个问题,如果你想要点击去看方法的内容,没办法做到
+33
View File
@@ -0,0 +1,33 @@
/*
* @Author : huangzj
* @Time : 2020/11/13 9:34
* @Description
*/
package jsonEnhance
import (
"github.com/json-iterator/go"
)
var (
//config 默认配置
config = jsoniter.ConfigFastest
)
func MarshalToString(v interface{}) string {
s, err := config.MarshalToString(v)
if err != nil {
panic(err)
}
return s
}
//UnmarshalFromString 直接从字符串反序列化
func UnmarshalFromString(str string, v interface{}) {
err := config.UnmarshalFromString(str, v)
if err != nil {
panic(err)
}
}
+15 -2
View File
@@ -29,8 +29,21 @@ func Test(t *testing.T) {
//Combine(query) //组合两个数组的两种方式 //Combine(query) //组合两个数组的两种方式
//fmt.Println(fmt.Sprintf("跳过三个元素,返回的数组中包含%d个元素", len(query.Skip(3).Results()))) fmt.Println(fmt.Sprintf("跳过三个元素,返回的数组中包含%d个元素", len(query.Skip(3).Results())))
//fmt.Println(fmt.Sprintf("跳过发布时间在2020.1.1之前的元素,返回的数组中包含%d个元素", len(query.SkipWhile(PublishTimeBeforeFunc).Results()))) fmt.Println(fmt.Sprintf("跳过发布时间在2020.1.1之前的元素,返回的数组中包含%d个元素", len(query.SkipWhile(PublishTimeBeforeFunc).Results()))) //这个方法好像有问题,没办法过滤
author := make([]string, 0)
query.Select(func(book interface{}) interface{} {
return book.(Book).Author
}).ToSlice(&author)
fmt.Println(author)
query1 := linq.From([][]Book{bookList, bookList})
query1.SelectMany(func(query interface{}) linq.Query {
fmt.Println(query)
return linq.From(query)
}).Select(func(book interface{}) interface{} {
return book.(Book).Author
}).ToSlice(&author)
fmt.Println(author)
//Contains(query) //判断数组中是否包含某个元素 //Contains(query) //判断数组中是否包含某个元素
//query.CountWith() //query.CountWith()
+6
View File
@@ -2,3 +2,9 @@
github.com/ahmetalpbalkan/go-linq github.com/ahmetalpbalkan/go-linq
# github.com/go-ini/ini v1.57.0 # github.com/go-ini/ini v1.57.0
github.com/go-ini/ini github.com/go-ini/ini
# github.com/json-iterator/go v1.1.10
github.com/json-iterator/go
# github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421
github.com/modern-go/concurrent
# github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742
github.com/modern-go/reflect2