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

This commit is contained in:
Huangzj
2020-11-23 11:00:36 +08:00
parent 179e5f6a31
commit 333d7a5d66
47 changed files with 2851 additions and 1469 deletions
+2 -2
View File
@@ -8,7 +8,7 @@ package ProgressTest
import (
"Go-Tool/util/file"
"Go-Tool/util/jsonEnhance"
"encoding/json"
)
type DeliverList struct {
@@ -24,6 +24,6 @@ type Deliver struct {
func MakeData() DeliverList {
var deliver DeliverList
content, _ := file.ReadJsonFile("F:\\Go_BySelf\\src\\Go-Tool\\ProgressTest\\deliverData.json")
jsonEnhance.UnmarshalFromString(content, &deliver)
_ = json.Unmarshal([]byte(content), &deliver)
return deliver
}
+30 -29
View File
@@ -9,13 +9,14 @@ package ProgressTest
import (
"Go-Tool/util/rand"
"fmt"
_ "github.com/ahmetb/go-linq"
"math"
"testing"
)
const (
MinGroupNum = 10
MaxGroupNum = 80
MaxGroupNum = 30
)
//需求(直接举例)
@@ -26,22 +27,16 @@ const (
//第四步: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) //进行分组操作
dataList := MakeData() //创建数据
resultList := deliver2(dataList.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)
leaveNum, partitions, partition, newDelivers := FirstOrder(delivers, newDelivers)
resultList = withCompletePartition(partitions, resultList) //对完整的分组进行处理
resultList = withLeavePartition(resultList, newDelivers, leaveNum, partition) //对剩余的分组进行处理
@@ -63,7 +58,7 @@ func withCompletePartition(partitions [][]*Deliver, resultList [][]int) [][]int
return resultList
}
func FirstOrder(delivers []*Deliver, newDelivers []*Deliver) (int, [][]*Deliver, int) {
func FirstOrder(delivers []*Deliver, newDelivers []*Deliver) (int, [][]*Deliver, int, []*Deliver) {
newDelivers = firstOrderRule(delivers) //第一次排序
partition := len(newDelivers) / MaxGroupNum
leaveNum := len(newDelivers) % MaxGroupNum
@@ -72,25 +67,29 @@ func FirstOrder(delivers []*Deliver, newDelivers []*Deliver) (int, [][]*Deliver,
for i := 0; i < partition; i++ {
partitions = append(partitions, newDelivers[i*MaxGroupNum:(i+1)*MaxGroupNum])
}
return leaveNum, partitions, partition
return leaveNum, partitions, partition, newDelivers
}
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:]))...)
}
resultList = moreThenFour(listNum, resultList, newDelivers) //大于4倍区间的处理
} else {
resultList = append(resultList, calculateByLeft(toList(newDelivers))...)
resultList = append(resultList, calculateByLeft(thirdOrderRule(newDelivers))...)
}
return resultList
}
func moreThenFour(listNum int, resultList [][]int, newDelivers []*Deliver) [][]int {
fourInOne := listNum / (4 * MinGroupNum)
leave := listNum % (4 * MinGroupNum)
for i := 0; i < fourInOne; i++ {
resultList = append(resultList, calculateByLeft(thirdOrderRule(newDelivers[i*4*MinGroupNum:(i+1)*4*MinGroupNum]))...) //四倍在一组的计算
}
if leave != 0 {
resultList = append(resultList, calculateByLeft(thirdOrderRule(newDelivers[fourInOne*4*MinGroupNum:]))...)
}
return resultList
}
@@ -103,12 +102,6 @@ func toList(deliver []*Deliver) [][]int {
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 {
@@ -138,3 +131,11 @@ func getFirstSome(list [][]int) []int {
func getFrontAndEnd(leftList [][]int) ([]int, [][]int) {
return rand.GetAwardByWeightWithLeftAward(leftList)
}
func init() {
//初始化排序规则
firstOrderRule = FirstOrderRule
secondOrderRule = SecondOrderRule
thirdOrderRule = ThirdOrderRule
}
+2 -2
View File
@@ -1,7 +1,7 @@
/*
* @Author : huangzj
* @Time : 2020/11/13 12:00
* @Description:在工程中有一个需求是对 指定数量的数组进行划分,按照每一层的规则分成对应数量,这边做一个测试.
* @Description:在工程中有一个需求是对 指定数量的数组进行划分,按照每一层的规则分成对应数量,这边做一个测试.(这种方式写的代码太麻烦了,直接废弃,后面有机会再弄)
*/
package ProgressTest
@@ -9,7 +9,7 @@ package ProgressTest
import (
"Go-Tool/util/rand"
"fmt"
"github.com/ahmetalpbalkan/go-linq"
"github.com/ahmetb/go-linq"
"testing"
)
+1 -1
View File
@@ -6,7 +6,7 @@
package ProgressTest
import "github.com/ahmetalpbalkan/go-linq"
import "github.com/ahmetb/go-linq"
type orderRule = func([]*Deliver) []*Deliver
type intOrderRule = func([]*Deliver) [][]int