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)
TStringListの中でソートしてあるので、TStringListでの添え字は使えません。
配列から検索するしかないと思います。
その場合は、同じ値があった場合に不定(ロジックによりますが、同じ添え字)になります。
TStringListのObjectsプロパティに、あらかじめもとの添え字を入れてからソートするとか、
ソート関数を自作してやるとか、いくらか方法はあると思います。
お手軽なのは前者だと思います。(後者なら、元の添え字を得る方法はまた考えなければいけませんし)
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;
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;
IndexOf の使い方がわかりました。ありがとうございました。
>TStringListのObjectsプロパティに、あらかじめもとの添え字を入れてからソートする・・
Objectsプロパティのヘルプには
「オブジェクトを既存の文字列に関連付けるには,Strings プロパティでその文字列のものと同じインデックスを使って Objects プロパティを設定します。」
とあるのですが、理解できません(^^;。もう一言suggestionいただけますでしょうか?
...
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);
...
まったく説明になってないなぁ〜。
通りすがりさん、ありがとうございました。
期待通りの結果が得られることは確認しました。
が、しかし理解するにはまだまだ修行が足りないようです。
ツイート | ![]() |