Seite 1 von 1

Datenlist vergleiche (neu, gelöscht)

Verfasst: 28.11.2020 12:06
von marcelx
Hallo zusammen

ich habe 2 Listen, eine alte und eine neue
Alt mit
A
B

Neue mit
A
C

Liefert eine Liste der gelöschte Einträgen : B
Liefert eine Liste der neue Einträgen : C

Kennt jemand eine Lösung?

Danke

Re: Datenlist vergleiche (neu, gelöscht)

Verfasst: 28.11.2020 12:14
von STARGÅTE
Sind die Einträge deiner Listen unique? Oder kann "A" auch mehrmals vorkommen?
Wenn die Listen unique sind, kannst du Maps verwenden.
Ansonsten guck mal ob die Levenshtein-Distanz was für dich wäre.
Mit ihr können Änderungen erkannt werden, und was nötig ist, um zwei Zeichenketten (Listen) ineinander zu überführen (Hinzufügen, Löschen, Verschieben).

Re: Datenlist vergleiche (neu, gelöscht)

Verfasst: 28.11.2020 12:20
von marcelx
Ja, die beiden Listen sind unique
Was die Levenshtein-Distanz angeht, schaue ich es mir an
Wie meinst Du mit Maps!

Re: Datenlist vergleiche (neu, gelöscht)

Verfasst: 28.11.2020 13:45
von HeX0R
Ich hab da mal was vorbereitet

Re: Datenlist vergleiche (neu, gelöscht)

Verfasst: 28.11.2020 15:05
von marcelx
Ich will kein "String A ungefähr wie String B" bekommen sonder wissen was dazu gekommen ist und was gelöscht wurde.

Ich habe es so gelöst:

Code: Alles auswählen

NewMap old.s()
old("A")=""
old("B")=""


NewMap new.s()
new("A")=""
new("C")=""

NewMap union.s()
CopyMap(old(), union())

ForEach new()
  AddMapElement(union(), MapKey(new()))
Next

key.s
ForEach union()
  key = MapKey(union())
  If FindMapElement(old(), Key) And Not FindMapElement(new(), Key)
    Debug "DEL "+key
  ElseIf FindMapElement(new(), Key) And Not FindMapElement(old(), Key)
    Debug "NEW "+key
  EndIf
Next

Re: Datenlist vergleiche (neu, gelöscht)

Verfasst: 28.11.2020 15:07
von NicTheQuick
Wenn beide Listen sortierbar oder sogar schon vorsortiert sind, dann ist es sehr einfach. Du iterierst über beide sortierte Listen gleichzeitig und prüfst jedes Mal zwischen ElementA aus Liste A und ElementB aus Liste B folgendes:
  • Ist ElementA = ElementB, dann gehe in jeder Liste einen Schritt weiter
  • Ist ElementA < ElementB, dann fehlt ElementA in Liste B, wurde also entfernt. Gehe nun einen Schritt weiter in Liste A
  • Ist ElementA > ElementB, dann fehlt ElementB in Liste A, wurde also hinzugefügt. Gehe nun einen Schritt weiter in Liste B
Bist du am Ende einer der beiden Listen angekommen, ist es glaube ich logisch, was du tun musst. :wink:

Re: Datenlist vergleiche (neu, gelöscht)

Verfasst: 29.11.2020 21:45
von Nino
Du kannst auch eine fertige Bibliothek für Mengen-Operationen benutzen: https://www.purebasic.fr/english/viewto ... 12&t=45787

Für kleinere Probleme ist das wohl Overkill. Dafür wird dein Programm schön kurz. :-)

Code: Alles auswählen

XIncludeFile "<Pfad>/set.pbi"

Define.Set::Set Alt, Neu, Geloescht, Hinzugefuegt

Set::FromString("{A,B}", Alt)
Set::FromString("{A,C}", Neu)

Set::Difference(Alt, Neu, Geloescht)
Set::Difference(Neu, Alt, Hinzugefuegt)

Debug Set::ToString(Geloescht)
Debug Set::ToString(Hinzugefuegt)

Re: Datenlist vergleiche (neu, gelöscht)

Verfasst: 30.11.2020 18:23
von marcelx
Dank Nino
Ist wirklich einfach - ich werde es probieren