1. ホーム
  2. arrays

[解決済み] Perlで配列から値を削除する最良の方法は何ですか?

2023-06-14 19:30:14

質問

配列に多くのデータがあり、2つの要素を削除する必要があります。

以下は、私が使用しているコードスニペットです。

my @array = (1,2,3,4,5,5,6,5,4,9);
my $element_omitted = 5;
@array = grep { $_ != $element_omitted } @array;

どのように解決するのですか?

削除したい要素のインデックスが既に分かっている場合は、spliceを使用します。

検索する場合はGrepが有効です。

もしこれらをたくさん行う必要があるなら、配列をソートした状態にしておくと、必要なインデックスを見つけるためにバイナリサーチを行うことができるので、はるかに良いパフォーマンスを得ることができます。

もしそれがあなたのコンテキストで意味をなすなら、データ移動を節約するために、削除されたレコードを削除するのではなく、削除されたレコードに "マジック値" を使うことを考慮したいと思うかもしれません -- たとえば、削除された要素を undef に設定します。 もちろん、これには独自の問題がありますが ("live"要素の数を知る必要がある場合、それを個別に追跡する必要があるなど)、アプリケーションによっては、手間をかける価値があるかもしれません。

編集 実は今、もう一度見てみると -- 上のグレップコードは使わないでください。削除したい要素のインデックスを見つけて、それを削除するためにspliceを使うのがより効率的でしょう(あなたが持っているコードは、すべての非マッチングの結果を蓄積します...)。

my $index = 0;
$index++ until $arr[$index] eq 'foo';
splice(@arr, $index, 1);

これは最初の出現を削除します。 すべての出現箇所を削除することは、1回のパスですべてのインデックスを取得したいことを除いて、非常によく似ています。

my @del_indexes = grep { $arr[$_] eq 'foo' } 0..$#arr;

残りは読者のための練習問題として残してあります。

編集2 John Siracusaが私の例にバグがあることを正しく指摘してくれました...修正しました。