Files
Go-tool/ProgressTest/DeliverRule_test.go
T

96 lines
3.3 KiB
Go
Raw Normal View History

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