AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Doppelte Einträge in Array filtern

Offene Frage von "dominikkv"
Ein Thema von dominikkv · begonnen am 2. Nov 2007 · letzter Beitrag vom 2. Nov 2007
Antwort Antwort
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#1

Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 17:00
Hi

Ich suche in einem Array of String (vereinfacht) und bekomme als Ergebnis nen Array of ^String:
SuchErgebnis: Array of ^String; in diesem können allerdings Einträge doppelt vorkommen.
Ich suche nun die beste (und schnellste!) Möglichkeit doppelte Einträge zu finden.
Soll heißen zum Schluss möchte ich ein
EndErgebnis: Array of ^String haben der keine doppelten Einträge hat!

Bisher mache ich das so:
Delphi-Quellcode:
var Gefunden: Boolean;
    I, J: Cardinal;
begin
  SetLength(EndErgebnis, 1);
  EndErgebnis[0] := Addr(SuchErgebnis[0]^); // SuchErgebnis hat IMMER mindestens einen Eintrag
  for I := 1 to high(SuchErgebnis) do
    begin
      gefunden := false;
      for J := 0 to high(EndErgebnis) do
        if EndErgebnis[J]^ = SuchErgebnis[I]^ then
          begin
            gefunden := True;
            break;
          end;
      if not gefunden then
        begin
          SetLength(EndErgebnis, Succ(Length(EndErgebnis)));
          EndErgebnis[high(EndErgebnis)] := Addr(SuchErgebnis[I]^);
        end;
    end; // for I
end;
Bei 25000 Suchergebnissen dauert das ca 1-2 Sekunden.
Hat jemand ein Optimierungsvorschlag?

mfg.Dominik
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 17:50
Hallo,

bis Du auf ein Array festgelegt?
Wenn nicht schaut Dir mal die TStringList an, da kannst Du mit
den Optionen "sorted" und "DupIgnore" arbeiten.

Grüße
Klaus
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#3

Re: Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 17:59
hmm bei der StringList muss ich aber mit strings arbeiten und nicht mit pointern, was ich glaube um einiges langsamer ist.
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#4

Re: Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 18:47
sag mal, ist dein array sortiert? falls nicht, würde ich es dir dringend anraten, dann kannste auch recht perfomant prüfen ob der string enthalten ist und ggf. diesen gar nicht einfügen, oder mit EINEM durchlauf die duplikate entfernen.

im anderen fall, ist deine routine ziemlich optimal... und du wirst dich an die zeiten (und längere) gewöhnen müssen...
  Mit Zitat antworten Zitat
Benutzerbild von FAlter
FAlter

Registriert seit: 21. Jul 2004
Ort: Ostfildern
1.096 Beiträge
 
FreePascal / Lazarus
 
#5

Re: Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 19:02
Hi,

Zitat von dominikkv:
hmm bei der StringList muss ich aber mit strings arbeiten und nicht mit pointern, was ich glaube um einiges langsamer ist.
Ist dir bewusst, wie ein (Ansi/Wide)String Delphi-intern aufgebaut ist? Es handelt sich um einen Zeiger auf das erste Zeichen. Vorher stehen 4 Bytes für die Länge, nach dem letzten Zeichen kommt noch #0. Ein ^String wäre also genaugenommen ein Zeiger auf einen Zeiger (außer bei {$H-}).

Und wenn du a^ := b^ machst, kommst du bestimmt nicht schneller als mit c := d (wobei a und b ^String und c und d normale Strings sind). In deinem Code sehe ich keinen Grund, nicht direkt Strings zu verwenden.

Mfg
FAlter
Felix Alter
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#6

Re: Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 19:12
ähh ja ist mir klar... nur mein String ist eigendlich ein
String255 = String[255]; und somit
SuchErgebnis, EndErgebnis: Array of ^String255 Sry hätte ich vllt erwähnen sollen... nur ich wollte das so unkompliziert wie möglich machen, damit das verstanden wird.
SuchErgebnis ist darüber hinaus in Wirklichkeit ein String255 in einem Record in einem Record -.-

Ich were mal schauen ob ich die ganzen SetLength in der schleife umgehen kann... vllt bringts ja was
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 19:33
Hallo Dominik,

bedenke, dass für jeden ShortString der maximal benötigte Speicherplatz reserviert wird - AnsiStrings sind da viel ökonomischer.

Delphi-Quellcode:
procedure ExtractUniqueStrings(list, result: TStrings);
var
  temp: TStringList;
begin
  temp := TStringList.Create;
  temp.Sorted := True;
  temp.Duplicates := dupIgnore;
  try
    temp.Assign(list);
    result.Assign(temp);
  finally
    temp.Free;
  end;
end;
Grüße vom marabu
  Mit Zitat antworten Zitat
dominikkv

Registriert seit: 30. Sep 2006
Ort: Gundelfingen
1.109 Beiträge
 
Delphi 2007 Professional
 
#8

Re: Doppelte Einträge in Array filtern

  Alt 2. Nov 2007, 19:58
Allerdings brauche ich um Strings in eine Datei zu speichern eine finalization, geht also nur mit ShortStrings.
Ich werde trotzdem mal die StringList ausprobieren...
Dominik
Wer anderen eine Grube gräbt, hat ein Gruben-Grab-Gerät!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 Uhr.
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