Autor |
Beitrag |
wurzel
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Do 27.09.07 10:39
Hallo...
Hab 3 Listen, die im TXT-Format vorliegen. Was ich halt noch brauche, ist dass nicht nur Liste a mit Liste b verglichen wird, sondern auch mit Liste c...Und da werden in Zukunft halt noch serhr viele Listen kommen. Mein bisheriger Such-Code
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
| procedure TForm1.Button1Click(Sender: TObject); var i, k, l : integer; target : String; temp : integer;
begin Memo1.Clear; count_dbl := 0; Liste_1 := TStringlist.Create; Liste_2 := TStringlist.Create; Liste_3 := TStringlist.Create; Liste_1.LoadFromFile(Edit1.Text + 'l1.txt'); Liste_2.LoadFromFile(Edit1.Text + 'l2.txt'); Liste_3.LoadFromFile(Edit1.Text + 'l3.txt'); count_l1 := Liste_1.Count; count_l2 := Liste_2.Count; count_l3 := Liste_3.Count; Memo1.Lines.Add('Liste 1: ' + IntToStr(count_l1)); Memo1.Lines.Add('Liste 2: ' + IntToStr(count_l2)); Memo1.Lines.Add('Liste 3: ' + IntToStr(count_l3)); for i := 0 to Liste_1.Count - 1 do begin target := Liste_1.Strings[i]; Memo1.Lines.Add(target); for l := 0 to Liste_2.Count - 1 do begin if target = Liste_2.Strings[l] then begin count_dbl := count_dbl + 1; Memo2.Lines.Add(Liste_2.Strings[l]); end; end; end; Label1.Caption := IntToStr(count_dbl); end; |
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.09.07 10:42
Moin!
wurzel hat folgendes geschrieben: | Hab 3 Listen, die im TXT-Format vorliegen. Was ich halt noch brauche, ist dass nicht nur Liste a mit Liste b verglichen wird, sondern auch mit Liste c...Und da werden in Zukunft halt noch serhr viele Listen kommen. |
Und was soll das Ergebnis dieses Vergleichs sein? Identität, Differenz, Schnittmenge, ...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
wurzel 
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Do 27.09.07 10:44
Als Ergebnis bekomme ich doppelte Einträge
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 27.09.07 10:58
jede liste mit jeder?
oder hast du ne referenz-liste?
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.09.07 11:03
Moin!
Also ich unterstelle mal die Schnittmenge (= Zeilen, die in allen Listen vorkommen).
Ansatz: Schreib dir eine Prozedur, die zwei Stringlisten übergeben bekommt und dafür sorgt, dass nach dem Aufruf in der zweiten SL nur noch Strings enthalten sind, die auch in der ersten SL drin sind. Dann gehst du in einer Schleife von 1 bis (MaxSL-1) durch und übergibst paarweise die SLs. Am Ende hast du in der letzten Liste nur noch die Strings, die in allen Listen enthalten sind.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
wurzel 
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Do 27.09.07 11:38
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.09.07 11:48
Moin!
Dann verwendest du halt zum Sammeln der Schnittmenge eine weitere SL und lässt die anderen Listen unverändert.
Wenn du die Schnittmengenliste hast, gehst du in einem weiteren Lauf über alle Listen und kannst dann die Positionen der Schnittmengeelemente in der Originalliste z.B. mit .IndexOf() ermitteln.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
wurzel 
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Do 27.09.07 11:52
Das klingt vernünftig, aber das Problem mit dem jede Liste mit Jeder ist noch nicht gelöst. Weil wenn ich es so wie du mache, dann hab ich ja nur die gleichen Einträge aus der 1. und 2. Liste und such damit die 3. ab. Macht für mich keinen Sinn, vllt gibt es ja in der 2. Liste Einträge die in der 3. sind, nicht aber in der 1.
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 27.09.07 11:55
ganz einfach
rekursion ^^
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
wurzel 
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Do 27.09.07 11:59
Wenn du mir das jetzt noch erklärst 
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 27.09.07 12:02
na klar
de.wikipedia.org/wiki/Rekursion
ich bastel dir mal n Beispiel..aber nur als denkanstoss^^
sonst krieg ich wieder ärger von Narses *g*
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.09.07 12:04
Moin!
wurzel hat folgendes geschrieben: | Das klingt vernünftig, aber das Problem mit dem jede Liste mit Jeder ist noch nicht gelöst. Weil wenn ich es so wie du mache, dann hab ich ja nur die gleichen Einträge aus der 1. und 2. Liste und such damit die 3. ab. Macht für mich keinen Sinn, vllt gibt es ja in der 2. Liste Einträge die in der 3. sind, nicht aber in der 1. |
Hm  es handelt sich also nicht um eine Schnittmenge oder du weißt nicht, was "Schnittmenge" bedeutet...
Vielleicht erklärst du nochmal kurz, WAS GENAU du eigentlich machen willst (z.B. mit sagen wir mal 3 oder 4 Listen); weil, diese Rekursionsgeschichte, das wird nicht ganz einfach...
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
wurzel 
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Do 27.09.07 12:09
Also, im Moment habe ich 3 Listen, das woird in Zukunft aber über 60. Mein Programm soll nun die erste Liste nehmen, das mit allen anderen Listen vergleichen und mehrfache Einträge im Endeffekt in ne Datei mit Angabe in welcher Liste die Einträge gefunden worden sind. Dann wird die 2. Liste genommen und wieder mit allen anderen Listen verglichen und dann die 3. Liste und etc...Am Ende hab ich ne Liste, wo drin steht welcher Eintrag doppelt ist und in welcher Liste die Einträge zu finden sind.
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 27.09.07 12:17
Suchen von doppelten Einträgen und Rückgabe dieser Einträge:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26:
| function getDoppelte(List1, List2: TStringList; var Dolist: TStringList): Boolean; var i: Integer; doPos: Integer; begin;
getDoppelte:= false;
if List1.Count = 0 then exit;
if List2.Count = 0 then exit;
doPos:= -1; for i:= 0 to list1.Count-1 do begin doPos:= list2.IndexOf(list1.Strings[i]); if doPos > -1 then Dolist.Add(list1.strings[i] + ' (' + inttostr(doPos) + ')'); end;
getDoppelte:= true; end; |
Schnell geschrieben, sollte funktionieren..
Diese Funktion kannst du verwenden, um deine Rekursion aufzubauen.
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Zuletzt bearbeitet von ZeitGeist87 am Do 27.09.07 12:18, insgesamt 1-mal bearbeitet
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Do 27.09.07 12:18
Moin!
OK, du willst also paarweise Duplikate auflisten.  Dafür brauchst du keine Rekursion, da reichen auch geschachtelte Schleifen.  Schau mal nach PERMUTATION, damit solltest du weiter kommen.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Do 27.09.07 13:58
Testprogramm im Anhang..
Sogar ohne Rekursion ^^
Known "Bug":
Liste vergleicht sich mit sich selbst nochmal..
Einloggen, um Attachments anzusehen!
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
Zuletzt bearbeitet von ZeitGeist87 am Do 27.09.07 14:03, insgesamt 1-mal bearbeitet
|
|
Horst_H
      
Beiträge: 1654
Erhaltene Danke: 244
WIN10,PuppyLinux
FreePascal,Lazarus
|
Verfasst: Do 27.09.07 13:59
Hallo,
mach es doch richtig kompliziert.
Siehe www.delphibasics.co.uk./RTL.asp?Name=TList
Du erstellst eine Liste aus Strings und einer Menge, die festhält, wo dieser String vorkommt, bei welcher Liste zuerst und wie oft.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| type TAlleListe = class private Eintrag : String; Vorkommen : set of 0..255; PosErstesVorkommen : integer; Häufigkeit : Integer; ..... |
Du fügst dieser neue Liste neue Werte zu(AlleList.insert(Eintrag,ListenNummer) muss selber komponiert werden) und achtest dabei darauf , ob es diesen Eintrag schon gibt.
Wenn nein dann
Eintrag eintragen,(sortiert am besten, und testen das Listennummer nicht > 255 wird, sonst TBits verwenden)
Listennummer in Vorkommen eintragen
ErstesVorkommen auf Listennummersetzen
Häufigkeit auf 1
sonst
Listennummer in Vorkommen eintragen
Häufigkeit erhöhen
Dadurch hast Du dann eine Liste, die nur einmal jede Liste einliest (und nicht n*(n-1)~n^2 , z.B 60 statt 3600) und schlußendlich alle Einträge enthält mit Angabe der Liste in der dieser Eintrag zuerst vorkam und in welchen Listen er zu finden ist.
Ich hoffe, das war nicht zu wüst.
Gruß Horst
P.S.
n^2 und nicht n! Permutation ist ja nicht nötig...
|
|
wurzel 
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Do 27.09.07 14:33
ZeitGeist87 hat folgendes geschrieben: | Testprogramm im Anhang..
Sogar ohne Rekursion ^^
Known "Bug":
Liste vergleicht sich mit sich selbst nochmal.. |
Hey danke, sowas hab ich gebraucht. Und der Quellcode ist auch verständlich, aber ich werde ihn mir nochmal genauer angucken.
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
wurzel 
      
Beiträge: 75
Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
|
Verfasst: Fr 28.09.07 11:11
Ich hatte da ne Idee...man könnte ja i mit i2 vergleichen. Wenn i = i2, dann soll er i2 um 1 erhöhen. Aber das klappt nicht, da ich ne Variable einer FOR-Schleife nicht einfach so ändern kann. Wie kann ich das umgehen? Weil damir hätte ich den Vergleich mit sich selbst ausgeschaltet
_________________ "Könntest du deinen Egotrip mal kurz unterbrechen? Es ist was wichtiges passiert." - "Wenn es irgendwas wichtigeres als mein Ego gibt, verlange ich, dass man es auf der Stelle verhaftet und erschießt."
|
|
ZeitGeist87
      
Beiträge: 1593
Erhaltene Danke: 20
Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
|
Verfasst: Fr 28.09.07 11:17
while oder repeat..until
LG
Stefan
_________________ Wer Provokationen, Ironie, Sarkasmus oder Zynismus herauslesen kann soll sie ignorieren um den Inhalt meiner Beiträge ungetrübt erfassen zu können.
|
|
|