stringlistでsortした配列の添字を得るには?

解決


tama  2003-11-06 03:26:13  No: 5595

procedure TForm1.FormCreate(Sender: TObject);
var i:integer;
    a:array[0..5] of integer;
    ds:string;
    St:Tstringlist;
begin
  a[1]:=41;
  a[2]:=23;
  a[3]:=14;
  a[4]:=97;
  a[5]:=52;
  St:=Tstringlist.Create;
  St.Clear;
  st.Sorted:=true;
  for i:=1 to 5 do st.Append(inttostr(a[i]));
  for i:=1 to 5 do begin
    a[i]:=strtoint(St.strings[i-1]);
    ds:=ds+inttostr(a[i])+',';
  end;
  showmessage(ds);
  st.free;
end;

を実行すると、sortされた結果「14,23,41,52,97,」が表示されます。
このとき、配列の添字の順序「3,2,1,5,4」を表示するにはどうすればいいのでしょうか?
(Win-Xp-home,D7-pro)


にしの  2003-11-06 03:43:25  No: 5596

TStringListの中でソートしてあるので、TStringListでの添え字は使えません。
配列から検索するしかないと思います。
その場合は、同じ値があった場合に不定(ロジックによりますが、同じ添え字)になります。


たかみちえ  URL  2003-11-06 04:02:51  No: 5597

TStringListのObjectsプロパティに、あらかじめもとの添え字を入れてからソートするとか、
ソート関数を自作してやるとか、いくらか方法はあると思います。

  お手軽なのは前者だと思います。(後者なら、元の添え字を得る方法はまた考えなければいけませんし)


<>  2003-11-06 05:21:09  No: 5598

procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
  a:array[0..5] of integer;
  ds:string;
  St: Tstringlist;
begin
  a[1]:=41;
  a[2]:=23;
  a[3]:=14;
  a[4]:=97;
  a[5]:=52;
  St:=Tstringlist.Create;
  St.Sorted:=true;
  for i:=1 to 5 do begin
    St.Append(inttostr(a[i]));
    a[i]:= St.IndexOf(IntToStr(a[i]));
    ds:=ds+inttostr(a[i]+1)+',';
  end;
  showmessage(ds);
  st.free;
end;


訂正<>  2003-11-06 05:23:43  No: 5599

procedure TForm1.FormCreate(Sender: TObject);
var
  i:integer;
  a:array[0..5] of integer;
  ds:string;
  St: Tstringlist;
begin
  a[1]:=41;
  a[2]:=23;
  a[3]:=14;
  a[4]:=97;
  a[5]:=52;
  St:=Tstringlist.Create;
  St.Sorted:=true;
  for i:=1 to 5 do St.Append(inttostr(a[i]));
  for i:=1 to 5 do begin
    a[i]:= St.IndexOf(IntToStr(a[i]));
    ds:=ds+inttostr(a[i]+1)+',';
  end;
  showmessage(ds);
  st.free;
end;


tama  2003-11-06 18:22:00  No: 5600

IndexOf の使い方がわかりました。ありがとうございました。

>TStringListのObjectsプロパティに、あらかじめもとの添え字を入れてからソートする・・
Objectsプロパティのヘルプには
「オブジェクトを既存の文字列に関連付けるには,Strings プロパティでその文字列のものと同じインデックスを使って Objects プロパティを設定します。」
とあるのですが、理解できません(^^;。もう一言suggestionいただけますでしょうか?


通りすがり  2003-11-06 20:38:48  No: 5601

...
  St.Sorted := True;
  for i := 1 to 5 do
    St.AddObject(IntToStr(a[i]),Pointer(i));

  ds := '';
  for i := 1 to 5 do
    ds := ds
        +St.Strings[i-1]+'='
        +IntToStr(Integer(St.Objects[i-1]))+',';

  ShowMessage(ds);
...
まったく説明になってないなぁ〜。


tama  2003-11-06 22:02:38  No: 5602

通りすがりさん、ありがとうございました。
期待通りの結果が得られることは確認しました。
が、しかし理解するにはまだまだ修行が足りないようです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加