配列の値を入れ替えるには


オラクル勉強中  2009-08-20 09:59:16  No: 35463  IP: 192.*.*.*

いつもお世話になっております。
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]には変数の値を突っ込んでいます。

このようなごりごり作戦以外に何かスマートな方法はございませんか?
よろしくお願い致します。

編集 削除
monaa  2009-08-20 12:27:29  No: 35464  IP: 192.*.*.*

配列で確保された領域はメモリーのアドレスが一列に並んでますので、
データのシフトはデータ量に比例して低速になります。
入れ替えを重視したデータ構造を取るなら、
各データをクラスで持たせて、隣り合うデータへのポインタを保持したりするのはどうでしょうか?

編集 削除
ttt  2009-08-20 12:59:17  No: 35465  IP: 192.*.*.*

削除や挿入を頻繁に行うなら、一般的にはリストデータ構造を使います。
中身が文字列だったらTStringListですね。
Delphiのリストの実体は配列だから必ずしも速くはないかもしれませんが、
操作は楽になるはずです。

編集 削除
通りすがり  2009-08-20 13:00:24  No: 35466  IP: 192.*.*.*

構造体(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;

取り急ぎこんな感じで...

編集 削除
D  2009-08-20 13:33:19  No: 35467  IP: 192.*.*.*

>このようなごりごり作戦以外に何かスマートな方法はございませんか?
  やってることは結局ごりごりなんだと思いますが、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;

編集 削除
通りすがり  2009-08-20 15:01:26  No: 35468  IP: 192.*.*.*

コピーではなかったんですね、失礼しました。  m(__)m

編集 削除
TS  2009-08-20 15:19:53  No: 35469  IP: 192.*.*.*

>質問の前に過去ログの検索をかけたのですが、Delphi以外の
>ものも合わせてヒットし、思うように解決方法が見つけられ
>ませんでした。

質問と関係ありませんが、
Google利用のサイト内検索の不具合
https://www.petitmonte.com/bbs/answers?question_id=6424

moochoさんの回答内容を使わせて貰ってます。

編集 削除
オラクル勉強中  2009-08-21 19:53:23  No: 35470  IP: 192.*.*.*

皆様アドバイス、レスありがとうございます。

質問を投稿してから仕事が忙しくなり未だ皆様のアドバイスを参考にコーディングできておりません。

申し訳ございませんが、検証結果とお礼などは週明け改めて書き込み致します。

取り急ぎ皆様に感謝・・・

Delphiの仕事がしたいです・・・TT

編集 削除