Заменить данные в массиве структуры в Голанге

Я решил его использовать,

import java.util.logging.Logger;
import java.util.logging.Level;

Logger mongoLogger = Logger.getLogger( "org.mongodb.driver" );
mongoLogger.setLevel(Level.SEVERE); // e.g. or Log.WARNING, etc.
0
задан Fatchul Amin 3 March 2019 в 02:51
поделиться

2 ответа

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

Затем, наконец, вы можете исправить свою логику:

[112 ]
0
ответ дан Ed Chan 3 March 2019 в 02:51
поделиться

Ваша логика предполагает, что длина 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
ответ дан sgraham 3 March 2019 в 02:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: