nbsp; fCompare:= aCompare; end;procedure TmwStringHashList.AddString(S: String); var HashWord: TmwHashWord; HashValue: Integer; HashItems: TmwHashItems; begin HashValue:= fHash(S); if HashEx(S, HashValue) then exit; if HashValue >= fCapacity then SetCapacity(HashValue); if Items[HashValue] = nil then begin Items[HashValue]:= TmwHashWord.Create(S); end else if TObject(Items[HashValue]) is TmwHashItems then begin TmwHashItems(Items[HashValue]).AddString(S); end else begin HashWord:= Items[HashValue]; HashItems:= TmwHashItems.Create; Items[HashValue]:= HashItems; HashItems.AddString(HashWord.S); HashWord.Free; HashItems.AddString(S); end; end; function TmwStringHashList.Hash(S: String): Boolean; begin Result:= HashEX(S, fHash(S)); end; function TmwStringHashList.HashEX(S: String; HashValue: Integer): Boolean; var Temp: TObject; Hashword: TmwHashWord; HashItems: TmwHashItems; I: Integer; begin Result:= False; if HashValue < 1 then Exit; if HashValue > Capacity then Exit; if Items[HashValue] <> nil then begin if TObject(Items[HashValue]) is TmwHashWord then begin Result:= fCompare(TmwHashWord(Items[HashValue]).S, S); end else begin HashItems:= Items[HashValue]; if Length(S) > HashItems.Capacity then Exit; Temp:= HashItems[Length(S)]; if Temp <> nil then if Temp is TmwHashWord then begin Result:= fCompare(TmwHashWord(Temp).S, S); end else for I:= 0 to TmwHashStrings(Temp).Count -1 do begin HashWord:= TmwHashStrings(Temp)[I]; Result:= fCompare(HashWord.S, S); if Result then exit; end; end; end; end; Initialization InitTables; end.
上一页 [1] [2] |