Autor Beitrag
wurzel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: 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

ausblenden volle Höhe 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:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 27.09.07 10:42 
Moin!

user profile iconwurzel 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, ... :nixweiss:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
wurzel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
wurzel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: Do 27.09.07 11:38 
user profile iconZeitGeist87 hat folgendes geschrieben:
jede liste mit jeder?
oder hast du ne referenz-liste?


Jede Liste mit jeder

user profile iconNarses hat folgendes geschrieben:
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. :idea:

cu
Narses


Das klappt so net denke ich, weil ich am Ende auch noch wissen muss wo die doppelten Strings vorhanden waren

Moderiert von user profile iconNarses: Doppelposting entfernt.

_________________
"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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
wurzel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 27.09.07 12:04 
Moin!

user profile iconwurzel 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... :nixweiss:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: Do 27.09.07 12:17 
Suchen von doppelten Einträgen und Rückgabe dieser Einträge:

ausblenden 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;

 //Datenprüfung
 if List1.Count = 0 then
  exit;

 if List2.Count = 0 then
  exit;

 doPos:= -1;
 for i:= 0 to list1.Count-1 do
 begin
  //Suche Eintrag
  doPos:= list2.IndexOf(list1.Strings[i]);
  //Eintrag vorhanden
  if doPos > -1 then //in DoppelteListe aufnehmen
   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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Do 27.09.07 12:18 
Moin!

OK, du willst also paarweise Duplikate auflisten. :think: Dafür brauchst du keine Rekursion, da reichen auch geschachtelte Schleifen. ;) Schau mal nach Suche in: Delphi-Forum, Delphi-Library PERMUTATION, damit solltest du weiter kommen. :idea:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
ZeitGeist87
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1654
Erhaltene Danke: 244

WIN10,PuppyLinux
FreePascal,Lazarus
BeitragVerfasst: 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.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
type
  // Meine ListenListe
  TAlleListe = class
    private
      // The data fields of this new class
      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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: Do 27.09.07 14:33 
user profile iconZeitGeist87 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75

Win 2000, Win XP
BDS 2006 (Delphi, Delphi .NET, C++)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1593
Erhaltene Danke: 20

Win95-Win10
Delphi 10 Seattle, Rad Studio 2007, Delphi 7 Prof., C++, WSH, Turbo Pascal, PHP, Delphi X2
BeitragVerfasst: 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.