猿问

使用 Go 在一段结构中按时间求平均值

我正在以一种基本的方式在一个结构片段中按小时平均值,我会得到一个更好的方法来获得一个最通用的函数,它可以按小时、天、周等进行平均。提前致谢致所有人。


package main


import (

    "fmt"

    "math/rand"

    "time"

)


type Acc struct {

    name  string

    money int

    date time.Time

}


type Accs []Acc


const 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


慕雪6442864
浏览 313回答 2
2回答

慕盖茨4494581

对于未排序的数据首先在类型 Accs []Acc 上实现排序接口。然后,您可以轻松地按小时、天、周进行排序。对于排序数据在 Accs 上创建 GroupBy 方法。func&nbsp;(accs&nbsp;Accs)&nbsp;GroupBy(p&nbsp;func(Acc,Acc)&nbsp;bool)&nbsp;[][]Accs&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;your&nbsp;looping/comparing/grouping&nbsp;code&nbsp;goes&nbsp;here &nbsp;&nbsp;&nbsp;&nbsp;}使用谓词函数 p 传入特定于组的代码,用于比较两个 Acc 结构以查看它们是否应该在同一组中。将 Accs 分组后,您可以求和、平均等。
随时随地看视频慕课网APP

相关分类

Go
我要回答