我正在以一种基本的方式在一个结构片段中按小时平均值,我会得到一个更好的方法来获得一个最通用的函数,它可以按小时、天、周等进行平均。提前致谢致所有人。package mainimport ( "fmt" "math/rand" "time")type Acc struct { name string money int date time.Time}type Accs []Accconst Tformat = "02/01/2006 15:04:05"func main() { var myaccs Accs acc := 0 var loops int var hour int f1, _ := time.Parse(Tformat, "29/08/2013 00:00:19") // Creating a Slice of structs for i := 0; i < 10; i++ { f1 = f1.Add(20 * time.Minute) //adding 20 minutes to every record myaccs = append(myaccs, Acc{name: "christian", money: rand.Intn(200), date: f1}) fmt.Printf("Added to slice: %v, %d, %s\n", myaccs[i].name, myaccs[i].money, myaccs[i].date) } // Averaging for _, v := range myaccs { if acc == 0 { hour = v.date.Hour() acc += v.money loops++ } else { if v.date.Hour() == hour { acc += v.money loops++ } else { fmt.Printf("Average money value to hour %d : %d\n", hour, acc / loops) //->Action acc = v.money hour = v.date.Hour() loops = 1 } } //fmt.Println(v, acc, loops, hour) } fmt.Printf("Average money value to hour %d : %d\n", hour, acc / loops)//->Action}注意:Money 变量只是一个像示例一样的 int .. 注意2:我正在考虑数据已经排序Playground:http : //play.golang.org/p/lL3YDD4ecE
2 回答
慕盖茨4494581
TA贡献1850条经验 获得超11个赞
对于未排序的数据
首先在类型 Accs []Acc 上实现排序接口。然后,您可以轻松地按小时、天、周进行排序。
对于排序数据
在 Accs 上创建 GroupBy 方法。
func (accs Accs) GroupBy(p func(Acc,Acc) bool) [][]Accs { // your looping/comparing/grouping code goes here }
使用谓词函数 p 传入特定于组的代码,用于比较两个 Acc 结构以查看它们是否应该在同一组中。
将 Accs 分组后,您可以求和、平均等。
- 2 回答
- 0 关注
- 312 浏览
添加回答
举报
0/150
提交
取消