1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
| type
tAOS = array of string;
tAOI = array of integer;
procedure Tri_Casiers2_StrArrayIndexes(const DonneesTxt: tAOS; ProfMaxTri: integer; TriCroissant: boolean; var IndexesOrdreTri: tAOI);
type
PStringItem = ^TStringItem;
TStringItem = record
Value: string;
IndexTri : integer;
Next: PStringItem;
end;
TCharList = array[#0..#255] of PStringItem;
var iot : integer;
function FillList(List: tAOS; Index, Delta: Integer; const Items: TCharList; CharPos: Integer): Integer;
var
SubList: TCharList;
FirstChar: Char;
NthChar: Char;
Item: PStringItem;
Next: PStringItem;
SensDeTri: shortInt;
begin
Result := 0;
for FirstChar := #0 to #255 do
begin
Item := Items[FirstChar];
if Item = nil then Continue;
if Item.Next = nil then
begin
List[Index] := Item.Value;
inc(iot); IndexesOrdreTri[iot]:=Index;
Inc(Index, Delta);
Continue;
end;
FillChar(SubList, SizeOf(SubList), 0);
repeat
Next := Item.Next;
if (CharPos > ProfMaxTri) or (CharPos > Length(Item.Value)) then
begin
List[Index] := Item.Value;
inc(iot); IndexesOrdreTri[iot]:=Index;
Inc(Index, Delta);
end else begin
NthChar := Item.Value[CharPos];
Item.Next := SubList[NthChar];
SubList[NthChar] := Item;
end;
Item := Next;
until Item = nil;
Index := FillList(List, Index, Delta, SubList, CharPos + 1);
end;
Result := Index;
end; // FillList
var
AllItems: array of TStringItem;
FirstList: TCharList;
Index: Integer;
Count: Integer;
Str: string;
FirstChar: Char;
Item: PStringItem;
Delta: Integer;
begin
SetLength(AllItems, length(DonneesTxt));
SetLength(IndexesOrdreTri,length(DonneesTxt));
FillChar(FirstList, SizeOf(FirstList), 0);
Count := 0;
for Index := 0 to High(DonneesTxt) do
begin
Str := DonneesTxt[Index];
if Str <> '' then
begin
Inc(Count);
Item := @AllItems[Index];
Item.Value := Str;
Item.IndexTri := Index;
FirstChar := Str[1];
Item.Next := FirstList[FirstChar];
FirstList[FirstChar] := Item;
end;
end;
//SetLength(DonneesTxt, Count);
SetLength(IndexesOrdreTri,Count); iot:=-1;
if TriCroissant then Index := FillList(DonneesTxt, 0, +1, FirstList, 2)
else Index := FillList(DonneesTxt, Count - 1, -1, FirstList, 2);
end; // Tri_Casiers2_StrArrayIndexes |
Partager