猿问

在 Golang 中替换数组结构中的数据

我有 3 个结构数据(GOLANG),我称之为A、B和C,当数据相似或大于 0 时,结构 C 是结构 A 和 B 之间的结果数组替换,然后我使用数组将所有结果设置为结构 C。


Struct A, B, C {

 TransactionDate  string 

 TotalAmount      string 

 TotalTransaction string 

}


A = [

     {2019-02-01 0 0} 

     {2019-02-02 0 0} 

     {2019-02-03 0 0} 

     {2019-02-04 0 0} 

     {2019-02-05 0 0} 

     {2019-02-06 0 0} 

     {2019-02-07 0 0}

   ]


B = [

     {2019-02-02 1000 2} 

     {2019-02-07 200 3}

    ]

我希望结果就像


C = [

     {2019-02-01 0 0} 

     {2019-02-02 1000 2} 

     {2019-02-03 0 0} 

     {2019-02-04 0 0} 

     {2019-02-05 0 0} 

     {2019-02-06 0 0} 

     {2019-02-07 200 3}

  ]

我尝试这样使用,但我仍然不喜欢我的预期结果,你能帮我解决这个问题吗?


func compareReplace() []C{

 var a []A

 var b []B

 var c []C   

 for i := 0; i < len(a); i++ { 

  if a[i].TransactionDate == b[i].TransactionDate {

        if b[i].TotalTransaction != "0" {

            c = append(c, b[i])

        }

  }

 }


 return c

}

或者我们可以在https://play.golang.org/p/H-aaolvSDZt上合作


扬帆大鱼
浏览 141回答 2
2回答

白猪掌柜的

您的逻辑假设的长度a始终是有条件迭代的正确计数。因为较小的切片将不再具有与较大的切片匹配的索引。a[i].TransactionDate == b[i].TransactionDate为了理智,在这种情况下,您应该检查以找到要迭代的最小计数,但是,这将不允许您完全检查所有最大的切片。我建议合并切片,然后找到最大和最小的范围并循环以从合并中删除您想要的内容。注意:@EdChan 使用一个结构是正确的,因为它们都是一样的。type FooBar struct {    TransactionDate  string    TotalAmount      string    TotalTransaction string}type FooBarSlice []FooBar // this is used as a receiver on func Removefunc compareReplace(a []FooBar, b []FooBar) []FooBar {    var c FooBarSlice    c = append(a, b...)    var largerSlice []FooBar    var smallerSlice []FooBar    if len(a) <= len(b) {        largerSlice = b        smallerSlice = a    } else {        largerSlice = a        smallerSlice = b    }    for _, v := range smallerSlice {        for j := 0; j < len(largerSlice); j++ {            if largerSlice[j].TransactionDate == v.TransactionDate && largerSlice[j].TotalTransaction == "0" {                c.Remove(j)            }        }    }    return c}完整的工作示例:https ://play.golang.org/p/iyUYtXlDG54

侃侃尔雅

首先,我会考虑只声明一个结构,因为A,B和 的字段C是相同的。例如:type FooBar struct {&nbsp; &nbsp; TransactionDate&nbsp; string&nbsp;&nbsp; &nbsp; TotalAmount&nbsp; &nbsp; &nbsp; string&nbsp;&nbsp; &nbsp; TotalTransaction string&nbsp;}然后对于你的功能,你可以尝试将其重写为:func compareReplace(a []FooBar, b []FooBar) []FooBar{&nbsp;var c []foobar&nbsp;for i := 0; i < len(a); i++ {&nbsp;&nbsp; if a[i].TransactionDate == b[i].TransactionDate {&nbsp; &nbsp; &nbsp; &nbsp; if b[i].TotalTransaction != "0" {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c = append(c, b[i])&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; }&nbsp;}&nbsp;return c}最后你可能想要修复你的逻辑:func compareReplace(a []FooBar, b []FooBar) []FooBar{&nbsp;var c []foobar&nbsp;for i := 0; i < len(a); i++ {&nbsp;&nbsp; if a[i].TransactionDate == b[i].TransactionDate {&nbsp; &nbsp; &nbsp; &nbsp; if b[i].TotalTransaction != "0" {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c = append(c, b[i])&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp;&nbsp; } else {&nbsp; &nbsp; // You might want to append a[i] if the date is mismatching&nbsp; &nbsp; c = append(c, b[i])&nbsp; }&nbsp;}&nbsp;return c}
随时随地看视频慕课网APP

相关分类

Go
我要回答