Zitat von
Helmi:
...ohne dies in einer Schleife zu erledigen...
Pos() benutzt auch eine Schleife. Anders ist das auch (kaum) möglich, du könntest das höchstens "hart" kodieren, was aber unsinnig wäre.
Was hingegen effizient wäre, wäre ein Bitvektor (32 Bytes), in dem du das dann überprüfst:
Delphi-Quellcode:
type
TCharBitVector=class
private
FBytes:
array[0..31]
of Byte;
public
function GetInVector(Character: Char): Boolean;
procedure SetInVector(Character: Char; InVector: Boolean);
procedure SetCharactersInVector(str:
String);
property Characters[Character: Char]: Boolean
read GetInVector
write SetInVector;
default;
end;
implementation
procedure CalcByteAndBitIndex(
const Character: Char;
var ByteIndex, BitIndex: Byte);
asm
movzx eax, al;
push BitIndex;
mov cl, 8;
div cl;
pop BitIndex;
mov [ByteIndex], al;
mov [BitIndex], ah;
end;
function TCharBitVector.GetInVector(Character: Char): Boolean;
var ByteIndex, BitIndex: Byte;
begin
CalcByteAndBitIndex(Character, ByteIndex, BitIndex);
Result:=Boolean((FBytes[ByteIndex]
shr BitIndex)
and 1);
end;
procedure TCharBitVector.SetInVector(Character: Char; InVector: Boolean);
var ByteIndex, BitIndex: Byte;
begin
CalcByteAndBitIndex(Character, ByteIndex, BitIndex);
if InVector
then
FBytes[ByteIndex]:=FBytes[ByteIndex]
or (1
shl BitIndex)
else
FBytes[ByteIndex]:=FBytes[ByteIndex]
and not (1
shl BitIndex);
end;
procedure TCharBitVector.SetCharactersInVector(str:
String);
var I: Integer;
begin
for I:=0
to 7
do
FBytes[I]:=0;
for I:=1
to length(str)
do
SetInVector(str[I], True);
end;
Zuweisung mehrerer Chars geht ganz bequem mit "myCharBitVector.SetCharacters('asdf');".
Nachsehen, ob ein Char drin ist mit "myCharBitVector['A]'"
Setzen eines einzigen Chars mit "myCharBitVector['A']:=True/False;"
Wenn du das nicht willst, kannst du die Chars wenigstens sortieren und dann eine binäre Suche durchführen.