Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Stringlist dupOnly (https://www.delphipraxis.net/99082-stringlist-duponly.html)

xtZ 6. Sep 2007 14:58


Stringlist dupOnly
 
Hallo,

Ich habe einige Einträge in einer sortierten Stringlist und würde nun gerne alle Einträge, die nicht doppelt vorhanden sind entfernen. Hat jemand vielleicht eine Idee, wie man das am schnellsten machen kann.

MFG

SirThornberry 6. Sep 2007 15:05

Re: Stringlist dupOnly
 
die Liste sortieren und dann in einer schleife durchgehen und schauen ob der Nachfolger den gleichen Wert hat wie der Vorgänger
Delphi-Quellcode:
begin
  [...]
  lNumFound := 0;
  lLastChecked := Liste.Strings[Liste.Count - 1];
  for i := Liste.Count - 1 downto 0 do
  begin
    if Liste.Strings[i] = LastChecked then
      NumFound := NumFound + 1
    else
    begin
      if (lNumFound > 1) then
        MehrfachVorhanden.Add(LastChecked);
      lNumFound := 1;
      LastChecked := 1;
    end;
  end;
  [...]

pstruh 6. Sep 2007 15:10

Re: Stringlist dupOnly
 
Hallo Jens,
ich würde die List (Idice 0 .. n) in den Grenzen 1 bis n-1 einmal durchlaufen und jedes Element, welches keinen identischen Vorgänger oder keinen identischen Nachfolger hat aus der Liste löschen. Damit sind nur noch Elemente vorhanden, die mindestens 2x in der Liste enthalten sind.
Gruß

xtZ 6. Sep 2007 15:17

Re: Stringlist dupOnly
 
Zitat:

Zitat von pstruh
Hallo Jens,
ich würde die List (Idice 0 .. n) in den Grenzen 1 bis n-1 einmal durchlaufen und jedes Element, welches keinen identischen Vorgänger oder keinen identischen Nachfolger hat aus der Liste löschen. Damit sind nur noch Elemente vorhanden, die mindestens 2x in der Liste enthalten sind.
Gruß

Hallo,
Hast du dafür vielleicht ein Beispiel, ich bekomme immer eine Exception (Listenindex überschreitet das Maximum).

pstruh 6. Sep 2007 15:20

Re: Stringlist dupOnly
 
Habe hier im Büro kein Delphi zur Verfügung, insofern nur so "aus dem Kopf heraus"...
Delphi-Quellcode:
procedure DeleteSingleItems(var List:TStringList);
var Idx : Integer;
begin
 Idx:=1;
 while Idx<List.Count-2 do
  if (List[Idx-1]<>List[Idx]) and
     (List[Idx+1]<>List[Idx]) then List.Delete(Idx)
                              else inc(Idx);
end;

xtZ 6. Sep 2007 15:26

Re: Stringlist dupOnly
 
Zitat:

Zitat von pstruh
Habe hier im Büro kein Delphi zur Verfügung, insofern nur so "aus dem Kopf heraus"...
Delphi-Quellcode:
procedure DeleteSingleItems(var List:TStringList);
var Idx : Integer;
begin
 Idx:=1;
 while Idx<List.Count-2 do
  if (List[Idx-1]<>List[Idx]) and
     (List[Idx+1]<>List[Idx]) then List.Delete(Idx)
                              else inc(Idx);
end;

Danke, das funktioniert schon fast, außer das der erste und der letzte Eintrag der Stringlist nicht behandelt/entfernt wird!?

pstruh 6. Sep 2007 15:32

Re: Stringlist dupOnly
 
Hallo xtZ, jooo, das ist so eine Sache mit der virtuellen Programmierung im Büro zwischen zwei Besprechungen. Sorry, das war dann wohl doch etwas "zu schnell geschossen". Aber vielleicht hilft es ja doch ein wenig in die richtige Richtung. Der Code von Jens (so ich das richtig sehe) die besonderheit, dass er mit 2 StringListen arbeitet. Vielleicht ist das tatsächlich einfacher (und vielleicht auch schneller). Du wirst schon noch 'ne Lösung bekommen.
Gruß aus Hamburg

xtZ 6. Sep 2007 15:42

Re: Stringlist dupOnly
 
Zitat:

Zitat von pstruh
Hallo xtZ, jooo, das ist so eine Sache mit der virtuellen Programmierung im Büro zwischen zwei Besprechungen. Sorry, das war dann wohl doch etwas "zu schnell geschossen". Aber vielleicht hilft es ja doch ein wenig in die richtige Richtung. Der Code von Jens (so ich das richtig sehe) die besonderheit, dass er mit 2 StringListen arbeitet. Vielleicht ist das tatsächlich einfacher (und vielleicht auch schneller). Du wirst schon noch 'ne Lösung bekommen.
Gruß aus Hamburg

Ja das versteh ich. Aber dein Code hat mir ja auch schon den nötigen Denkanstoß gegeben, es zu vollenden.
Delphi-Quellcode:
procedure OnlyDupes(var slList: TStringList);
var
  i: Integer;
begin
  i := 1;
  while i < slList.Count - 2 do
    if (slList[i - 1] <> slList[i]) and (slList[i + 1] <> slList[i]) then
      slList.Delete(i)
    else
      inc(i);
  if slList[0] <> slList[1] then
    slList.Delete(0);
  if slList[slList.Count - 1] <> slList[slList.Count - 2] then
    slList.Delete(slList.Count - 1);
end;
Danke nochmal. :wink:

Klaus01 6. Sep 2007 17:47

Re: Stringlist dupOnly
 
Guten Abend,

auch wenn das Problem schon gelöst ist, möchte ich doch noch diese Methode vorstellen.

Delphi-Quellcode:
procedure OnlyDupes(var slList: TStringList);
var
  sldummy : TStringList;
begin
  slDummy := TStringList.create;
  slDummy.sorted:=true;
  slDummy.duplicates:=dupIgnore;

  slDummy.assign(slList);
  slList.assign(slDummy);
  slDummy.free;

end;
Grüße
Klaus

pstruh 6. Sep 2007 17:55

Re: Stringlist dupOnly
 
Hallo Klaus,
also 'mal gaaaaaaaanz vorsichtig gefragt: Es sollen doch alle nur einfach vorhandenen Einträge aus der Liste verschwinden und nur die mehrfach vorhandenen Einträge übrig bleiben. Mit deiner Methode wird m. E. genau das Gegenteil bewirkt, es werden alle Mehrfacheinträge aus der Liste herausgenommen - oder denke ich da jetzt gaaaaaaanz falsch???
Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:15 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz