文字列配列(String[]
)があり、最初の項目を削除する必要があります。どうすればそれを効率的に行うことができますか?
文字列配列(String[]
)があり、最初の項目を削除する必要があります。どうすればそれを効率的に行うことができますか?
回答:
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
ArrayList
はO(n)であることに注意することが重要です。
ArrayList
場合LinkedList
。ただし。
Arrays.copyOfRange()
は、API9 +用です
最も簡単な方法はおそらく次のとおりです。基本的に、1要素小さい新しい配列を作成してから、保持する要素を正しい位置にコピーする必要があります。
int n=oldArray.length-1;
String[] newArray=new String[n];
System.arraycopy(oldArray,1,newArray,0,n);
この種の操作を頻繁に行う場合は、リンクリストなどの別の種類のデータ構造を実際に使用する必要があることを示している可能性があることに注意してください。毎回新しい配列を作成するのはO(n)演算であり、配列が大きいとコストがかかる可能性があります。リンクリストを使用すると、最初の要素をO(1)で削除できます。
別のアイデアは、最初の項目をまったく削除せず、使用中の最初のインデックスを指す整数をインクリメントすることです。アレイのユーザーはこのオフセットを考慮する必要がありますが、これは効率的なアプローチです。Java Stringクラスは、部分文字列を作成するときに、実際にはこのメソッドを内部的に使用します。
Arrays.copyOfRange()
です。
すぐに言うまでもなく、あなたはそれをまったく行うことができません。Javaの配列は固定サイズです。あなたができる2つのことは次のとおりです。
System.arraycopy
これらのいずれかに使用できます。これらは両方ともO(n)です。これは、1つの要素を除くすべてをコピーするためです。
最初の要素を頻繁に削除する場合は、LinkedList
代わりに使用することを検討してください。便利なようにLinkedList.remove
、Queue
インターフェースからのを使用できます。を使用LinkedList
すると、最初の要素を削除するとO(1)になります。実際、ListIterator
その位置に移動すると、要素の削除はO(1)になります。ただし、インデックスによって任意の要素にアクセスするのはO(n)です。
別の醜い方法:
String[] a ={"BLAH00001","DIK-11","DIK-2","MAN5"};
String[] k=Arrays.toString(a).split(", ",2)[1].split("]")[0].split(", ");