Заменить данные в массиве структуры в Голанге - PullRequest
0 голосов
/ 03 марта 2019

У меня есть 3 данных структуры (GOLANG) , которые я называю A , B и C , структура C является массивом результатовЗаменить между структурами A и B, когда данные похожи или больше 0, тогда я устанавливаю весь результат в структуру 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}
  ]

Iпопробуйте использовать это, но мне все еще не нравится мой ожидаемый результат, вы можете помочь мне решить эту проблему?

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 ]

0 голосов
/ 04 марта 2019

Ваша логика предполагает, что длина a всегда является правильным количеством для условной итерации.Игровая площадка, которую @FatchulAmin поделился в комментарии к ответу @EdChan, выявила проблему, когда a больше b или наоборот, вы получите ошибку «index out of range», потому что меньший срез больше не будет иметь индексовчтобы соответствовать большему.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

0 голосов
/ 03 марта 2019

Прежде всего, я хотел бы рассмотреть объявление только одной структуры, поскольку поля 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...