Datenlist vergleiche (neu, gelöscht)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Datenlist vergleiche (neu, gelöscht)

Beitrag 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
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6999
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Datenlist vergleiche (neu, gelöscht)

Beitrag 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).
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenlist vergleiche (neu, gelöscht)

Beitrag von marcelx »

Ja, die beiden Listen sind unique
Was die Levenshtein-Distanz angeht, schaue ich es mir an
Wie meinst Du mit Maps!
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
HeX0R
Beiträge: 2958
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win10 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2
Kontaktdaten:

Re: Datenlist vergleiche (neu, gelöscht)

Beitrag von HeX0R »

Ich hab da mal was vorbereitet
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenlist vergleiche (neu, gelöscht)

Beitrag 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
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8677
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Datenlist vergleiche (neu, gelöscht)

Beitrag 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:
Bild
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Datenlist vergleiche (neu, gelöscht)

Beitrag 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)
Benutzeravatar
marcelx
Beiträge: 424
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Datenlist vergleiche (neu, gelöscht)

Beitrag von marcelx »

Dank Nino
Ist wirklich einfach - ich werde es probieren
Win-10, PB 5.31 (Windows - x86)
Antworten