1. ホーム
  2. java

[解決済み] Javaで配列からオブジェクトを削除するには?

2023-05-14 01:48:08

質問

の配列が与えられたとき n オブジェクトであるとします。 文字列の配列 で、以下のような値を持っているとします。

foo[0] = "a";
foo[1] = "cc";
foo[2] = "a";
foo[3] = "dd";

に等しい文字列/オブジェクトをすべて削除/除去するには、どうすればよいでしょうか? "a"です。 に等しい文字列やオブジェクトを削除する必要がありますか?

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

[すぐに使えるコードが必要な場合は、私の "Edit3" までスクロールしてください (カット後)。残りは後世のためにここにあります]。

肉付けするために ダストマンのアイデア :

List<String> list = new ArrayList<String>(Arrays.asList(array));
list.removeAll(Arrays.asList("a"));
array = list.toArray(array);

編集:私は今 Arrays.asList の代わりに Collections.singleton : シングルトンは一つのエントリに限定されるのに対して asList アプローチでは、後でフィルタリングするために他の文字列を追加することができます。 Arrays.asList("a", "b", "c") .

Edit2: 上記の方法では、同じ配列が保持されます(つまり、配列は同じ長さのままです)。最後の要素より後の要素はnullに設定されます。もしあなたが 新しい という配列が必要な場合は、代わりにこれを使用します。

array = list.toArray(new String[0]);


Edit3: このコードを同じクラスで頻繁に使用する場合、このコードを追加することを検討するとよいでしょう。

private static final String[] EMPTY_STRING_ARRAY = new String[0];

すると、関数はこうなる。

List<String> list = new ArrayList<>();
Collections.addAll(list, array);
list.removeAll(Arrays.asList("a"));
array = list.toArray(EMPTY_STRING_ARRAY);

これにより、ヒープに無駄な空文字列の配列が散らばることがなくなります。 new になるような無駄な空文字列をヒープに散らさないようになります。

cynicalmanの提案(コメント参照)もヒープの散乱を助けるでしょうし、公平を期すため、それに言及しておきます。

array = list.toArray(new String[list.size()]);

私は自分のアプローチの方が好きです。なぜなら、明示的なサイズを間違えやすいかもしれないからです (例えば size() を間違ったリストで呼び出すなど)。