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 92 93 94 95 96 97 98 99 100 101 102
| type tAOI = array of integer;
procedure Tri_Casiers3_StrBis(const DonneesTxt: tStringList; ProfMaxTri: integer; TriCroissant: boolean; var IndexesOrdreTri: tAOI);
type
PStringItem = ^TStringItem;
TStringItem = record
Value: PChar;
Index: Integer;
Next: PStringItem;
end;
TCharList = array[#0..#255] of PStringItem;
procedure FillList(var Index: PInteger; Delta: Integer; const Items: TCharList; CharPos: Integer);
var
SubList: TCharList;
FirstChar: Char;
NthChar: Char;
Item: PStringItem;
Next: PStringItem;
SensDeTri: shortInt;
begin
for FirstChar := #0 to #255 do
begin
Item := Items[FirstChar];
if Item = nil then Continue;
if Item.Next = nil then
begin
Index^ := Item.Index;
Inc(Index, Delta);
Continue;
end;
FillChar(SubList, SizeOf(SubList), 0);
repeat
Next := Item.Next;
Inc(Item.Value);
if (CharPos > ProfMaxTri) or (Item.Value^ = #0) then
begin
Index^ := Item.Index;
Inc(Index, Delta);
end else begin
NthChar := Item.Value^;
Item.Next := SubList[NthChar];
SubList[NthChar] := Item;
end;
Item := Next;
until Item = nil;
FillList(Index, Delta, SubList, CharPos + 1);
end;
end; // FillList
var
AllItems: array of TStringItem;
FirstList: TCharList;
Index: Integer;
Count: Integer;
Str: string;
FirstChar: Char;
Item: PStringItem;
Delta: Integer;
//Indexes: array of Integer;
Idx: PInteger;
begin
SetLength(AllItems, DonneesTxt.Count);
FillChar(FirstList, SizeOf(FirstList), 0);
Count := 0;
for Index := 0 to DonneesTxt.Count - 1 do
begin
Str := DonneesTxt[Index];
if Str <> '' then
begin
Inc(Count);
Item := @AllItems[Index];
Item.Value := Pointer(Str);
Item.Index := Index; // Index dans la tableau
FirstChar := Item.Value^;
Item.Next := FirstList[FirstChar];
FirstList[FirstChar] := Item;
end;
end;
//SetLength(Indexes, Count);
SetLength(IndexesOrdreTri, Count);
{if TriCroissant then
begin
Idx := @Indexes[0];
FillList(Idx, +1, FirstList, 2)
end else begin
Idx := @Indexes[Count - 1];
FillList(Idx, -1, FirstList, 2);
end; }
if TriCroissant then
begin
Idx := @IndexesOrdreTri[0];
FillList(Idx, +1, FirstList, 2)
end else begin
Idx := @IndexesOrdreTri[Count - 1];
FillList(Idx, -1, FirstList, 2);
end;
end; // Tri_Casiers3_StrBis |
Partager