Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich ein Segment von Strukturen basierend auf bestimmten Feldern in Golang effizient gruppieren und zusammenfassen?

Wie kann ich ein Segment von Strukturen basierend auf bestimmten Feldern in Golang effizient gruppieren und zusammenfassen?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 20:47:03311Durchsuche

How can I efficiently group and sum a slice of structs based on specific fields in Golang?

Effiziente Gruppierung und Summierung von Strukturscheiben in Golang

In Golang ist der effiziente Umgang mit Daten von entscheidender Bedeutung. Beim Umgang mit Struktursegmenten können Aufgaben wie das Gruppieren und Summieren zu einer Herausforderung werden. Dieser Leitfaden befasst sich mit einem effizienten Ansatz zum Gruppieren und Zusammenfassen eines Teils von Strukturen basierend auf bestimmten Feldern.

Problemstellung

Bedenken Sie die folgende Struktur:

type Register struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
    money int
}

Das Ziel besteht darin, Register nach den Feldern id1, id2, id3, id4, id5, id6, id7 und id8 zu gruppieren und dann das zugehörige Geldfeld zu summieren.

Lösung

Die bereitgestellte Lösung beinhaltet eine leichte Umgestaltung der Strukturtypen. Durch Extrahieren der Schlüsselfelder in eine separate Struktur, Key, können wir die Vergleichbarkeit von Strukturen in Golang nutzen.

Refactored Types

type Key struct {
    id1 int
    id2 int
    id3 int
    id4 int
    id5 int
    id6 int
    id7 int
    id8 int
}

type Register struct {
    key   Key
    money int
}

Gruppierung und Summieren

Um das Gruppieren und Summieren zu erreichen, erstellen wir eine Map[Key]int. Der Schlüssel der Karte stellt die Kombination von ID-Feldern dar, während der Wert die Geldsumme für Register mit demselben Schlüssel darstellt.

regs := []*Register{
    {Key{id1: 345}, 1500},
    {Key{id1: 345, id2: 140}, 2700},
    {Key{id1: 345, id2: 140}, 1300},
    {Key{id1: 345}, 1000},
    {Key{id3: 999}, 1000},
    {Key{id3: 999}, 2000},
}

// calculate sum:
m := map[Key]int{}
for _, v := range regs {
    m[v.key] += v.money
}

Ausgabe

Die Karte bietet eine gruppierte und summierte Darstellung der Register.

map[{345 0 0 0 0 0 0 0}:2500 {345 140 0 0 0 0 0 0}:4000 {0 0 999 0 0 0 0 0}:3000]

Erweiterte Ausgabe

Zur besseren Lesbarkeit können wir die Ausgabe wie folgt formatieren:

fmt.Println("Nice output:")
for k, v := range m {
    fmt.Printf("%+3v: %d\n", k, v)
}

Ergebnis

Nice output:
{id1:345 id2:  0 id3:  0 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 2500
{id1:345 id2:140 id3:  0 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 4000
{id1:  0 id2:  0 id3:999 id4:  0 id5:  0 id6:  0 id7:  0 id8:  0}: 3000

Vorteile

Dieser Ansatz bietet mehrere Vorteile:

  • Vereinfacht Gruppieren und Summieren mithilfe von Karten
  • Effiziente Datenverarbeitung durch Nutzung vergleichbarer Strukturen
  • Flexibilität bei der Handhabung verschiedener Gruppierungskriterien durch die Verwendung der Schlüsselstruktur

Das obige ist der detaillierte Inhalt vonWie kann ich ein Segment von Strukturen basierend auf bestimmten Feldern in Golang effizient gruppieren und zusammenfassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn