配列から最初の要素を削除する最良の方法は何ですか?


86

文字列配列(String[])があり、最初の項目を削除する必要があります。どうすればそれを効率的に行うことができますか?



4
だまされていない。前の質問は、値によるアイテムの削除についてです。これは、インデックスによってアイテムを削除することについてです。
james.garriss 2013年

回答:


154

Javaの配列のサイズは変更できません。したがって、技術的には、配列から要素を削除することはできません。

配列からの要素の削除をシミュレートする1​​つの方法は、新しい小さい配列を作成してから、元の配列から新しい小さい配列にすべての要素をコピーすることです。

String[] yourArray = Arrays.copyOfRange(oldArr, 1, oldArr.length);

ただし、上記の方法はお勧めしません。あなたは本当にを使用する必要がありますList<String>。リストを使用すると、任意のインデックスにアイテムを追加したり、インデックスからアイテムを削除したりできます。これは次のようになります。

List<String> list = new ArrayList<String>(); // or LinkedList<String>();
list.add("Stuff");
// add lots of stuff
list.remove(0); // removes the first item

32
anの最初の要素を削除するのArrayListはO(n)であることに注意することが重要です。
Matthew Flaschen 2010

1
@Matt、配列とリスト用。しかし、コードはリストにとってはるかに簡単です。
jjnguy 2010

16
配列と。のArrayList場合LinkedList。ただし。
Matthew Flaschen 2010

4
オン) ?まあ..C配列で?拳の要素を削除するにはあなただけのポインタO(1)インクリメントすることができます
エルナンEche

2
私のようにAndroid用のJavaを使用している人Arrays.copyOfRange()は、API9 +用です
Sdghasemi 2015

14

最も簡単な方法はおそらく次のとおりです。基本的に、1要素小さい新しい配列を作成してから、保持する要素を正しい位置にコピーする必要があります。

int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);

この種の操作を頻繁に行う場合は、リンクリストなどの別の種類のデータ構造を実際に使用する必要があることを示している可能性があることに注意してください。毎回新しい配列を作成するのはO(n)演算であり、配列が大きいとコストがかかる可能性があります。リンクリストを使用すると、最初の要素をO(1)で削除できます。

別のアイデアは、最初の項目をまったく削除せず、使用中の最初のインデックスを指す整数をインクリメントすることです。アレイのユーザーはこのオフセットを考慮する必要がありますが、これは効率的なアプローチです。Java Stringクラスは、部分文字列を作成するときに、実際にはこのメソッドを内部的に使用します。


4
これは技術的に最も簡単な方法ではありません。 Arrays.copyOfRange()です。
jjnguy 2010

4
彼はJava6を使用しているため、よりコンパクトなArrays.copyOfRange
Thilo

1
@ Justin-確かですが、Java 1.6以降をターゲットにしている場合のみ
mikera 2010

1
本当。常に適用できるとは限りません。
jjnguy 2010

6
質問のタイトルは、OPJava1.6以降の回答に関心があることを明確にしています。
スティーブンC

5

すぐに言うまでもなく、あなたはそれをまったく行うことができません。Javaの配列は固定サイズです。あなたができる2つのことは次のとおりです。

  1. すべての要素を1つ上にシフトしてから、最後の要素をnullに設定します。
  2. 新しいアレイを作成し、それをコピーします。

System.arraycopyこれらのいずれかに使用できます。これらは両方ともO(n)です。これは、1つの要素を除くすべてをコピーするためです。

最初の要素を頻繁に削除する場合は、LinkedList代わりに使用することを検討してください。便利なようにLinkedList.removeQueueインターフェースからのを使用できます。を使用LinkedListすると、最初の要素を削除するとO(1)になります。実際、ListIteratorその位置に移動すると、要素の削除はO(1)になります。ただし、インデックスによって任意の要素にアクセスするのはO(n)です。


2

配列の最初の「ライブ」要素のインデックスを保持します。最初の要素を削除する(削除するふりをする)と、O(1)時間計算量の操作になります。


0

要約すると、クイックリンクリスト方式は次のとおりです。

List<String> llist = new LinkedList<String>(Arrays.asList(oldArray));
llist.remove(0);

-8

別の醜い方法:

   String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
   String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");

2
十分な評判のある人がこの答えに反対票を投じてください-それはまさにそれが言っていることです-醜いです!失礼な意図はありませんが、コーディングのしやすさのために、このような投稿はしないでください。
Hack5 2017年

すでに配列を使用している場合は、Arrays.copyOfRange
Bishal Gautam

彼は最善の方法を求めた。
Sapphire_Brick

それを削除して、どれだけの評判が得られるかを確認してください。
Sapphire_Brick
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.