[解決済み] 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が私の例にバグがあることを正しく指摘してくれました...修正しました。
関連
-
[解決済み] 配列から要素を1つだけ値で削除する方法
-
[解決済み] 配列から特定の項目を削除するにはどうすればよいですか?
-
[解決済み] JavaScript で配列に値が含まれているかどうかを確認するにはどうすればよいですか?
-
[解決済み] 配列からArrayListを作成する
-
[解決済み] JavaScriptの配列で一意な値をすべて取得する(重複を排除する)。
-
[解決済み] Java の配列を表示する最も簡単な方法は何ですか?
-
[解決済み] JavaScriptで配列の先頭に新しい配列要素を追加するにはどうすればよいですか?
-
[解決済み] Javascriptで配列から空の要素を削除する
-
[解決済み】オブジェクトの配列を文字列のプロパティ値でソートする
-
[解決済み】JavaScriptで配列の要素を削除する - delete vs splice
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Ruby: ハッシュの配列で Enumerator を取得しようとすると nil:NilClass の未定義メソッド `[]' が発生する。
-
[解決済み] Javascript/Typescriptで配列のクローンを作成する
-
[解決済み] 数百万のピクセルを持つ2Dの非ボックス化ピクセル配列にはどのようなHaskell表現が推奨されますか?
-
[解決済み] Bashでfindコマンドの結果を配列として保存するには?
-
[解決済み] bashでグローバルを使用せずに配列を返すには?
-
[解決済み] コマンドの出力を配列に代入する方法を教えてください。
-
[解決済み] Swiftのクロージャで$0と$1は何を意味するのか?
-
[解決済み] Google スプレッドシートで範囲を結合する方法
-
[解決済み] AngularJSカスタムフィルタ機能
-
[解決済み] Swiftで空の配列の辞書を初期化する