いつもお世話になっております。
Delphi7にて現在開発中です。
質問の前に過去ログの検索をかけたのですが、Delphi以外のものも合わせてヒットし、思うように解決方法が見つけられませんでした。。
質問内容は現在配列の入れ替えについて悩み中です。
wk_arrya[1] := 'A';
wk_arrya[2] := 'B';
wk_arrya[3] := 'C';
wk_arrya[4] := 'D';
という配列の順番を入れ替えたいのです。
例えば、wk_arrya[2]のデータを一番下に移動した時は以下の様にしたいです。
wk_arrya[1] := 'A';
wk_arrya[2] := 'C';
wk_arrya[3] := 'D';
wk_arrya[4] := 'B';
現在は、wk_arrya[2]のデータを変数に保持し、wk_arrya[3]をwk_arrya[2]に移動し、wk_arrya[4]をwk_arrya[3]に移動し、最後にwk_arrya[4]には変数の値を突っ込んでいます。
このようなごりごり作戦以外に何かスマートな方法はございませんか?
よろしくお願い致します。
配列で確保された領域はメモリーのアドレスが一列に並んでますので、
データのシフトはデータ量に比例して低速になります。
入れ替えを重視したデータ構造を取るなら、
各データをクラスで持たせて、隣り合うデータへのポインタを保持したりするのはどうでしょうか?
削除や挿入を頻繁に行うなら、一般的にはリストデータ構造を使います。
中身が文字列だったらTStringListですね。
Delphiのリストの実体は配列だから必ずしも速くはないかもしれませんが、
操作は楽になるはずです。
構造体(record)で宣言してその中に配列を入れれば
構造体毎コピーが出来ますが。
test_ = record
ibuf :array[0..10] of integer;
sbuf :array[0..10] of string;
end;
test1:test_;
test2:test_;
test1.sbuf[1] := 'abc';
test2 := test1;
取り急ぎこんな感じで...
>このようなごりごり作戦以外に何かスマートな方法はございませんか?
やってることは結局ごりごりなんだと思いますが、System.Move手続きはどうでしょうか。
procedure TForm1.Button1Click(Sender: TObject);
var
wk_arrya: array[1..4] of Char;
temp: Char;
begin
wk_arrya[1] := 'A';
wk_arrya[2] := 'B';
wk_arrya[3] := 'C';
wk_arrya[4] := 'D';
temp := wk_arrya[2];
System.Move(wk_arrya[3], wk_arrya[2], SizeOf(temp) * 2);
wk_arrya[4] := temp;
end;
コピーではなかったんですね、失礼しました。 m(__)m
編集 削除>質問の前に過去ログの検索をかけたのですが、Delphi以外の
>ものも合わせてヒットし、思うように解決方法が見つけられ
>ませんでした。
質問と関係ありませんが、
Google利用のサイト内検索の不具合
https://www.petitmonte.com/bbs/answers?question_id=6424
moochoさんの回答内容を使わせて貰ってます。
皆様アドバイス、レスありがとうございます。
質問を投稿してから仕事が忙しくなり未だ皆様のアドバイスを参考にコーディングできておりません。
申し訳ございませんが、検証結果とお礼などは週明け改めて書き込み致します。
取り急ぎ皆様に感謝・・・
Delphiの仕事がしたいです・・・TT