Seite 1 von 1

StructuredList - Duplikate entfernen mit Summierung

Verfasst: 04.02.2017 18:43
von ThoPie
Hallo Leute,
Ich habe eine Liste mit folgender Struktur.

Code: Alles auswählen

Structure TEST
  a.i
  b.i
Die Liste ist bereits nach Feld a sortiert. In a können doppelte Werte vorkommen und in b stehen andere Zahlen. Als Ergebnis brauche ich die Liste ohne Duplikate mit den Summen von b.
Also aus

Code: Alles auswählen

1 30
1 20
2 10
3 10
3 5
4 10
hätte ich gern

Code: Alles auswählen

1 50
2 10
3 15
4 10
Wie könnte ich das realisieren. Vielen Dank für eure Mühe.

Re: StructuredList - Duplikate entfernen mit Summierung

Verfasst: 04.02.2017 19:14
von mk-soft
Vielleicht mit Maps

Update

Code: Alles auswählen

Structure udtValues
  a.i
  b.i
EndStructure


Global NewList Values.udtValues()
Global NewMap Result.udtValues()

; Dummywerte anlegen
For i = 1 To 500
  AddElement(Values())
  Values()\a = Random(20, 1)
  Values()\b = Random(50, 10)
Next

; Summen in Map ablegen
ForEach Values()
  With Values()
    key.s = Str(Values()\a)
    If Not FindMapElement(Result(), key)
      Result(key)\a = \a
    EndIf
    Result()\b + \b
  EndWith
Next

; Ergebnis übernehmen
ClearList(Values())
ForEach Result()
  AddElement(Values())
  Values()\a = Result()\a
  Values()\b = Result()\b
Next

; Ausgabe
SortStructuredList(Values(), #PB_Sort_Ascending, 0, #PB_Integer)

ForEach Values()
  Debug Str(Values()\a) + " = " + Str(Values()\b)
Next
P.S. Kleines Update...

Re: StructuredList - Duplikate entfernen mit Summierung

Verfasst: 05.02.2017 00:48
von Sicro
@mk-soft:
ThoPie hat geschrieben:Die Liste ist bereits nach Feld a sortiert.
:wink:

Code: Alles auswählen

EnableExplicit

Structure ValuesStruc
  a.i
  b.i
EndStructure

Define.ValuesStruc NewList Values()
Define.i LastValueA, ValueB, i

; Dummywerte anlegen
For i = 1 To 500
  AddElement(Values())
  Values()\a = Random(20, 1)
  Values()\b = Random(50, 10)
Next
SortStructuredList(Values(), #PB_Sort_Ascending, OffsetOf(ValuesStruc\a), #PB_Integer)

; b-Werte von Duplikaten zusammenzählen und Duplikate löschen
FirstElement(Values())
LastValueA = Values()\a
While NextElement(Values())
  If Values()\a = LastValueA ; Duplikat vom vorherigem Eintrag der Liste?
    ValueB = Values()\b
    DeleteElement(Values())
    Values()\b + ValueB
  Else
    LastValueA = Values()\a
  EndIf
Wend

; Liste ausgeben
ForEach Values()
  Debug Str(Values()\a) + " === " + Str(Values()\b)
Next

Re: StructuredList - Duplikate entfernen mit Summierung

Verfasst: 05.02.2017 12:02
von mk-soft
@Sicro
Stimmt <)

Liegt wohl daran das ich ein Map-Fan geworden bin...

Re: StructuredList - Duplikate entfernen mit Summierung

Verfasst: 05.02.2017 17:02
von ThoPie
Hallo Leute.
Vielen Dank. Jetzt komme ich weiter.