0

Name 部分で TStringList をソートしようとしました。そのために、customSort メソッドを使用します。

少し例を示します:

    function CompareString(List : TStringList; Index1, Index2 : integer) : integer;
    begin
        result := AnsiCompareText(List.Names[Index1], List.Names[Index2]);
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
        Memo2.Clear;
        Liste.CustomSort(CompareString);     
        Memo2.Lines.Append(Liste.GetText)
    end;

    procedure TForm1.FormCreate(Sender: TObject);
    begin
        Liste := TStringList.Create;
        Liste.Append('INFOS_NEGOCE=NUM_CDE');
        Liste.Append('INFOS_NEGOCE=DATE_CDE');
        Liste.Append('INFOS_NEGOCE=NOM_REPERTOIRE_ENT');
        Liste.Append('INFOS_NEGOCE=NOM_CONTACT');     
        Memo1.Lines.Clear;
        Memo1.Lines.Append(Liste.GetText)
    end;

並べ替えにより、次の結果が得られます。

INFOS_NEGOCE=NOM_REPERTOIRE_ENT

INFOS_NEGOCE=NOM_CONTACT

INFOS_NEGOCE=NUM_CDE

INFOS_NEGOCE=DATE_CDE

ソートは行の順序を変更しないと思います(名前は常にINFOF_NEGOCEです)。

4

2 に答える 2

2

並べ替えは QuickSort で行います。これは、(ソートで見た) 同一項目の順序が定義されていないことを意味します。

クイックソート - 繰り返し要素を参照してください

于 2014-02-04T15:50:04.223 に答える
2
function CompareString(List : TStringList; Index1, Index2 : integer) : integer;
begin
  Result := AnsiCompareText(List.Names[Index1], List.Names[Index2]);
  // If you want to sort equal strings then on the Values
  if Result = 0 then Result := AnsiCompareText(List.ValueFromIndex[Index1], List.ValueFromIndex[Index2]);
  // Or if you want to keep the original order
  { if Result = 0 then Result := Index1-Index2; --- qv : this won't work!}
end;

Resultが等しい0場合、コードによってに設定されます。Namesそれらが等しい場合は、同じ名前のアイテムを並べ替えるために使用する追加の条件を選択します。


Uwe Raabe が正しく観察しているように、「元の順序」は機能しません。

しかし、すべてが失われるわけではありません。通常、Tstringlist に含まれるオブジェクトは使用されません。利用可能な場合は、ソートの直前に試してください

for i := 0 to pred(List.Count) do List.Objects[i] := TObject(i);

そして、ソートは次のようになります

function CompareString(List : TStringList; Index1, Index2 : integer) : integer;
begin
  Result := AnsiCompareText(List.Names[Index1], List.Names[Index2]);
  // If you want to sort equal strings then on the Values
  if Result = 0 then Result := AnsiCompareText(List.ValueFromIndex[Index1], List.ValueFromIndex[Index2]);
  // Or if you want to keep the original order
  if Result = 0 then Result := integer(List.Objects[Index1])-integer(List.Objects[Index2]);
end;

しかし、「正しい」順序がどのようなものであると予想されるかについての秘密を教えてもらえれば、はるかに簡単になります。

于 2014-02-04T16:03:00.467 に答える