为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
扬帆大鱼 2023-06-12 15:49:00
我有 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上合作
查看完整描述

2 回答

?
白猪掌柜的

TA贡献1893条经验 获得超10个赞

您的逻辑假设的长度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 Remove


func 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


查看完整回答
反对 回复 2023-06-12
?
侃侃尔雅

TA贡献1801条经验 获得超15个赞

首先,我会考虑只声明一个结构,因为A,B和 的字段C是相同的。例如:


type FooBar struct {

    TransactionDate  string 

    TotalAmount      string 

    TotalTransaction string 

}

然后对于你的功能,你可以尝试将其重写为:


func compareReplace(a []FooBar, b []FooBar) []FooBar{

 var c []foobar

 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

}

最后你可能想要修复你的逻辑:


func compareReplace(a []FooBar, b []FooBar) []FooBar{

 var c []foobar

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

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

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

            c = append(c, b[i])

        } 

  } else {

    // You might want to append a[i] if the date is mismatching

    c = append(c, b[i])

  }

 }

 return c

}


查看完整回答
反对 回复 2023-06-12
  • 2 回答
  • 0 关注
  • 140 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信