1.概要

このチュートリアルでは、配列の最初の要素を削除する方法について説明します。

さらに、https://docs.oracle.com/javase/8/docs/technotes/guides/collections/index.html[Java Collections Framework]のデータ構造を使用するとさらに簡単になることもわかります。

2.

Arrays.copyOfRange()を使う

まず第一に、

配列の要素を削除することは技術的には不可能です



公式ドキュメント

を引用するには

配列は、単一の型の固定数の値を保持するコンテナオブジェクトです。配列の長さは、配列が作成されたときに設定されます。作成後、その長さは固定されています。」

つまり、

配列を直接操作している限り、できることは最初の要素を含まない

より小さなサイズの新しい配列を作成することだけです。

幸いなことに、JDKは

Arrays.copyOfRange()

という便利な静的ヘルパー関数を提供しています。

String[]stringArray = {"foo", "bar", "baz"};
String[]modifiedArray = Arrays.copyOfRange(stringArray, 1, stringArray.length);

  • この操作は毎回新しい配列を作成するので、

    O(n)

    のコストがかかります。

もちろん、これは配列から要素を削除するための面倒な方法です。このような操作を定期的に行っている場合は、代わりにJava Collections Frameworkを使用するほうが賢明です。

3.

List

実装を使う

データ構造とほぼ同じセマンティクス(インデックスによってアクセス可能な順序付けられた要素のシーケンス)を維持するためには、https://docs.oracle.com/javase/8/docs/の実装を使用するのが合理的です。 api/java/util/List.html[

リスト

インタフェース]。

最も一般的な2つの実装は

ArrayList



LinkedList

です。

以下の

__List

__があるとします。

List<String> arrayList = new ArrayList<>();//populate the ArrayList

List<String> linkedList = new LinkedList<>();//populate the LinkedList

両方のクラスが同じインタフェースを実装しているので、最初の要素を削除するコード例は同じに見えます。

arrayList.remove(0);
linkedList.remove(0);


  • ArrayList

    の場合、削除のコストは

    O(n)

    ですが、

    LinkedList

    のコストは

    O(1)

    です。

これは、オブジェクトを取得するためのコストが逆になるためです。


get(i)

を呼び出すコストは、

ArrayList

の場合は

O(1)



LinkedList

の場合は

O(n)

です。

4.まとめ

  • Javaで配列の最初の要素を削除する方法を説明しました。さらに、Java Collections Frameworkを使用して同じ結果を得る方法についても説明しました。


over on GitHub

のサンプルコードがあります。