Einzelnen Beitrag anzeigen

Benutzerbild von Desmulator
Desmulator

Registriert seit: 3. Mai 2007
Ort: Bonn
169 Beiträge
 
#1

Doppelte Einträge prüfen

  Alt 16. Jul 2008, 11:55
HalliHallo,

also es geht sich um folgendes: Ich hab eine Liste von Tokens. Jeder Token hat auf eine ID, die ich an, der den Tokenizer benutzt zurückgebe, wenn das passende Token erkannt wurde. Somit kann der die Daten dann richtig verarbeiten. Logisch?

Allerdings braucht mein Tokenizer für jedes Token eine Priorität. Ein Token mit hoher Priorität wird vor einem Token mit niedriger Priorität erkannt. Beispiel :

Der String soll in Tokens gesplittet werden:

keyword Es gibt zwei Tokens:

Delphi-Quellcode:
Den Key, als feste Zeichenfolge, "keyword".
Die ZeichenRange [k,e,y,w,o,r,d]. Dabei können die Buchstaben in beliebiger Reihenfolge auftreten.
Was wird also nun in dem String erkannt? A: Der Key oder B : Die ZeichenRange? Dafür sind die Proiorities, mit ihrer Hilfe wird das Problem gelöst.

So nun das Problem. Ich will die Tokens, die sich in einer Array befinden, darauf prüfen, ob es keine doppelte ID bzw. Priorität gibt.

Aufbau:
Delphi-Quellcode:
TToken = record
 ID : Cardinal;
 Proiority : Cardinal;
 ...
end;

Tokens : array of TToken;
Meine Idee war es eine art Liste ( set ) mit zu führen und jede Zahl, die nicht bereits in der Liste ist, hinzu zufügen.
Sollte sie jedoch existieren, so wird False zurückgeben.

Delphi-Quellcode:
function TTokenizer.CheckConflict : Boolean;
var
  Index : Cardinal;
  IDs : set of Cardinal;
  Prioritys : set of Cardinal;
begin
  Index := 0;
  repeat
    if Tokens[Index].ID in IDs then begin
      Result := False;
      Exit;
    end;
    Include(IDs, Tokens[Index].ID);
  until Index = Length(Tokens);
  Index := 0;
  repeat
    if Tokens[Index].Priority in Prioritys then begin
      Result := False;
      Exit;
    end;
    Include(Prioritys, Tokens[Index].Priority);
  until Index = Length(Tokens);
end;
Doch dann viel mir noch vor dem ersten kompilieren ein, dass ein Set maximal 255 Einträge haben kann und Cardinal ein bischen mehr ( ca. 4 Mrd. ) hat.

Wie könnte ich das noch machen? Ich versuche bewust zu vermeiden, eine Array mitzuführen , diese immer vollkommen zudurchlaufe und auf den selben eintrag zuprüfen.

Mfg Desmu
Lars
There are 10 kinds of people in the world:
those who get binary, and those who don’t.
  Mit Zitat antworten Zitat