配列の最初の要素を削除する

配列の最初の要素を削除する

1. 概要

このチュートリアルでは、we’ll look at how to remove the first element of an array

さらに、Java Collections Frameworkのデータ構造を使用すると、作業がさらに簡単になることもわかります。

2. Arrays.copyOfRange()の使用

まず、removing an element of an array isn’t technically possible in Javaです。 official docsを引用するには:

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

これはas long as we’re working with an array directly, all we can do is create a new array of smaller size, which then doesn’t contain the first elementを意味します。

幸い、JDKには、Arrays.copyOfRange()と呼ばれる便利な静的ヘルパー関数が用意されています。

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

この操作は毎回新しい配列を作成するため、O(n)のコストがかかることに注意してください。

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

3. List実装の使用

データ構造(インデックスからアクセスできる要素の順序付けられたシーケンス)とほぼ同じセマンティクスを維持するには、List interfaceの実装を使用するのが理にかなっています。

最も一般的な2つの実装は、ArrayListLinkedListです。

次のListsがあるとします。

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

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

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

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

ArrayListの場合、削除のコストはO(n)ですが、LinkedListのコストはO(1)です。

さて、これは、オブジェクトを取得するためのコストが逆であるため、デフォルトとしてどこでもLinkedListを使用する必要があるという意味ではありません。 get(i)を呼び出すコストは、ArrayListの場合はO(1)LinkedListの場合はO(n)です。

4. 結論

We’ve seen how to remove the first element of an array in Java.さらに、Javaコレクションフレームワークを使用して同じ結果を達成する方法を確認しました。

サンプルコードover on GitHubを見つけることができます。