2020-11-16 18:09:28 +08:00
|
|
|
/*
|
|
|
|
|
* @Author : huangzj
|
|
|
|
|
* @Time : 2020/11/13 12:00
|
2020-11-23 11:00:36 +08:00
|
|
|
* @Description:在工程中有一个需求是对 指定数量的数组进行划分,按照每一层的规则分成对应数量,这边做一个测试.(这种方式写的代码太麻烦了,直接废弃,后面有机会再弄)
|
2020-11-16 18:09:28 +08:00
|
|
|
*/
|
|
|
|
|
|
2020-12-31 14:25:25 +08:00
|
|
|
package diliver
|
2020-11-16 18:09:28 +08:00
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"Go-Tool/util/rand"
|
|
|
|
|
"fmt"
|
2020-11-23 11:00:36 +08:00
|
|
|
"github.com/ahmetb/go-linq"
|
2020-11-16 18:09:28 +08:00
|
|
|
"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
|
|
|
|
|
}
|