リスト項目の削除方法の違いについて


デルデル  2016-05-02 04:30:42  No: 48168

リストの内容を削除する際に「delete」「remove」「extract」を使い分ける必要があるとの事で調べているのですがいまいち違いがわかりません。
簡潔で構いませんのでどういった違いがあるのか教えていただけませんでしょうか?
初歩的な質問ですみません。


igy  2016-05-02 06:29:54  No: 48169

ヘルプに書かれている TListの各メソッドの説明は、以下のようになります。

Delete メソッドは,Index パラメータで指定された位置にある項目を削除します。 
Delphi の構文:
procedure Delete(Index: Integer);
説明
Delete メソッドを呼び出すと,リストから特定の位置にある項目が削除されます。インデックスはどの場合も 0 で始まるので,最初の項目の Index 値は 0,2 番目の項目の Index 値は 1 になります。Delete メソッドを呼び出すと,削除された項目にしたがって Items 配列のすべての項目が押し上げられ,Count. プロパティの値が減少します。

Remove メソッドは,Item パラメータへの最初の参照を Items 配列から削除します。
Delphi の構文:
function Remove(Item: Pointer): Integer;
説明
Remove メソッドを呼び出すと,インデックスが未知の場合に特定の項目を Items 配列から削除します。戻り値は削除される前の項目のインデックスです。項目が削除されると,それ以降のすべての項目のインデックスの位置が繰り上がり,Count プロパティが 1 減ります。
Items 配列にポインタの複数のコピーがある場合,最初のコピーだけが削除されます。

Extract メソッドは,指定した項目をリストから削除します。
Delphi の構文:
function Extract(Item: Pointer): Pointer;
説明
Extract メソッドを呼び出すと,項目をリストから削除できます。項目が削除されると,削除された項目の後にあるすべてのオブジェクトのインデックスの位置が繰り上がり,Count プロパティの値がデクリメントされます。


通りすがり  2016-05-06 07:04:14  No: 48170

papyさん、修復ありがとうございました。某所ではもう帰ってくるなといわれているようなのでw
(Mr.XRAYさん、ご安心ください。ステハンでは書き込みませんので、イヤミを書く必要はありませんよ)

さて書き直し3回目なので面倒で説明が端折られているところがあるかもしれませんが、もしStarterでなければ
"Use the source, Luke!"ということで。

Deleteは引数がInteger型で、これはX番目のアイテムを削除、ということです。
Removeは引数がポインタ型で、これはリストの先頭から検索して、最初に見つかったアイテムを削除、になります。
Extractは引数がやはりポインタ型でRemoveとあまり変わらないように見えます。TListでは実際に違いはありません。
ではどこで違いが出るのかというと、派生クラスのTObjectListでOwnObjectsがTrueの場合で、Delete/Removeは
アイテムを削除するときにそのアイテムのFreeを呼び出すようになっていますが、Extractでは見つかったアイテムを
戻値にした後でnilに置き換え、その上でDeleteするようになっています。つまりExtractはリストからアイテムを
『取り出す』、という動作になっています。


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

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






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