123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- package main
- // 数据复杂分组测试
- func main() {
- // 分组策略列表
- policies := []GroupPolicy{
- {Area, Group},
- {Company, Hash},
- {Title, Group},
- }
- // 待分组数据记录列表
- items := []RecordItem{
- {Area: "", Company: "", Title: "", IsLeader: ""},
- {Area: "", Company: "", Title: "", IsLeader: ""},
- }
- // 根级,外面再加一层是为了适配下面的循环处理
- rootClusters := FilterClusters{
- {Seq: 0, Items: items},
- }
- // 循环变量
- clusters := rootClusters
- for _, policy := range policies {
- // 依次按照分组策略处理
- clusters = clusters.filter(policy)
- if nil == clusters || len(clusters) == 0 {
- return
- }
- }
- if len(clusters) == 0 {
- return
- }
- // 获得平铺的叶子节点
- var results []RecordItem
- for _, cluster := range clusters {
- if nil == cluster.Items || len(cluster.Items) == 0 {
- continue
- }
- results = append(results, cluster.Items...)
- }
- if nil == results || len(results) == 0 {
- return
- }
- // 求箱子数量
- length := len(results)
- groupSize := 50
- groupCount := length / groupSize
- if length%groupSize > 0 {
- groupCount++
- }
- // TODO 最后把results塞进箱子里就是
- }
- type RecordItem map[string]string // 数据记录
- // 聚类,多叉树形结构
- type FilterCluster struct {
- Seq int // 序号
- Items []RecordItem // 组内记录列表
- SubClusters FilterClusters // 子级聚类集合
- }
- type FilterClusters []FilterCluster // 聚类集合
- // 分组策略字段
- const (
- Area = "area"
- Company = "company"
- Title = "title"
- IsLeader = "isLeader"
- )
- // 分组策略类型
- type FilterType int8
- const (
- Random FilterType = iota // 随机
- Group // 聚合
- Hash // 散列
- )
- // 分组策略
- type GroupPolicy struct {
- Name string
- Type FilterType
- }
- // 策略模式,分支处理,返回当前聚类集合再进一步处理的子级聚类集合
- func (clusters *FilterClusters) filter(policy GroupPolicy) FilterClusters {
- if policy.Type == Random {
- return clusters.mapping(policy.Name, random)
- } else if policy.Type == Group {
- return clusters.mapping(policy.Name, group)
- } else if policy.Type == Hash {
- return clusters.mapping(policy.Name, hash)
- }
- return nil
- }
- // 将子级聚类集合映射关联到父级,如此,虽然仅返回子级聚类集合,但通过根级对象可以遍历整棵树
- func (clusters *FilterClusters) mapping(name string, fn func(string, FilterCluster) FilterClusters) FilterClusters {
- var allSubClusters FilterClusters
- for i := 0; i < len(*clusters); i++ {
- subClusters := fn(name, (*clusters)[i])
- if nil == subClusters || len(subClusters) == 0 {
- continue
- }
- (*clusters)[i].SubClusters = subClusters
- allSubClusters = append(allSubClusters, subClusters...)
- }
- if nil == allSubClusters || len(allSubClusters) == 0 {
- return nil
- }
- return allSubClusters
- }
- // TODO 随机算法实现
- func random(name string, cluster FilterCluster) FilterClusters {
- // 建议子级聚类数量 = 当前聚类中数据记录内,指定name字段的取值数
- // 记录随机排列即可
- return nil
- }
- // TODO 聚合算法实现
- func group(name string, cluster FilterCluster) FilterClusters {
- // 建议子级聚类数量 = 当前聚类中数据记录内,指定name字段的取值数
- // 简单近似处理,group by即可
- // 求最优解处理,建议多次迭代的kmeans
- return nil
- }
- // TODO 散列算法实现
- func hash(name string, cluster FilterCluster) FilterClusters {
- // 建议子级聚类数量 = 当前聚类中数据记录内,指定name字段的取值数
- // 简单近似处理,写个循环分布一下数据即可
- // 求最优解处理,建议多次迭代的kmeans
- return nil
- }
|