2009-03-13 26 views
113

Javaの配列から要素を削除する方法はありますか?配列から要素を削除する(Java)

+2

質問が重複していても、他の質問の回答はすばらしいものでも美しいものでもありません。 それは配列をarraylistに(手作業で)変換します。 – f1v3

答えて

199

あなたはコモンズLANGのArrayUtilsを使用することができます。

array = ArrayUtils.removeElement(array, element) 

commons.apache.org library:Javadocs

+0

これに相当するGuavaはありますか? –

+1

@Clive Guavaはコレクションでしか動作しないようです。 –

+2

これも配列を縮小しますか? –

35

基本的なJava配列から要素を削除することはできません。代わりに、さまざまなコレクションとArrayListを見てください。

+0

私は知っている、私はちょうどarraylistsかsthと美しい見える方法がほしいと思う。それのような、何かのヒント? – Tobias

+0

+1:LinkedListを使用すると、人生はより簡単になります。 –

+6

LinkedListはめったに良い考えではありません。 List intrrfaceはあなたにランダムアクセスを与えますが、LinkedListはO(1)の代わりにO(n)アクセス時間を与えます。 –

-5

確かに、別の配列を作成します:)

14

ニース探しているソリューションは、最初の場所に代わりに、配列のリストを使用することです。

List.remove(index) 

あなたは配列を使用するを持っている場合は、System.arraycopyへの2つの呼び出しが最も可能性の高い最速になります。

Foo[] result = new Foo[source.length - 1]; 
System.arraycopy(source, 0, result, 0, index); 
if (source.length != index) { 
    System.arraycopy(source, index + 1, result, index, source.length - index - 1); 
} 

Arrays.asListも配列を使用するための良い候補であるが、removeをサポートしていないようです。)

+1

+1:LinkedListまたはArrayListを使用します。 –

-3

使用ArrayList

alist.remove(1); //removes the element at position 1 
0

私はあなたが使用を望みますjavaコレクション/ javaコモンコレクション! java.util.ArrayList内で

は、次のようなことを行うことができます。

yourArrayList.remove(someObject); 

yourArrayList.add(someObject); 
+2

配列はコレクションではありません... – Nicolas

+0

しかし、ほとんどのコレクションは配列です! 参照:http://en.wikipedia.org/wiki/Array –

+1

しかし、この質問はタグ付きのJavaであり、Javaでは配列はコレクションではありません。 – Nicolas

0

Copyあなたの元の配列を別の配列に、削除される要素なし。

これを行う簡単な方法は、List、Set ...を使用してremove()メソッドを使用することです。

0

削除するアイテムを最後のアイテムと入れ替えます。アレイのサイズを変更することは重要ではありません。

+2

削除前に配列がソートされていれば、これは問題になります。 – eleven81

1

大丈夫、THXたくさん は今、私はこのようなSTHを使用します。

public static String[] removeElements(String[] input, String deleteMe) { 
    if (input != null) { 
     List<String> list = new ArrayList<String>(Arrays.asList(input)); 
     for (int i = 0; i < list.size(); i++) { 
      if (list.get(i).equals(deleteMe)) { 
       list.remove(i); 
      } 
     } 
     return list.toArray(new String[0]); 
    } else { 
     return new String[0]; 
    } 
} 
+0

実際に配列をそのままにしておく必要がある場合は、空のリストを作成し、このようにするのではなく正しい要素で埋めてください。 – Nicolas

+0

コレクションを使用することを提案したときに人々が念頭に置いていたことは、わかりませんが、いずれにせよ、それらのリストインデックスには注意が必要です。削除(try {"a"、 "b"、 "deleteMe"、 "deleteMe"、 "c"})の直後に要素をスキップしているようです。 –

36

最良の選択は、コレクションを使用することで、それが何らかの理由で出ている場合は、arraycopyを使用します。これを使用して、わずかに異なるオフセットで同じ配列からコピーすることができます。

たとえば、次のようにコメントに応答して

public void removeElement(Object[] arr, int removedIdx) { 
    System.arraycopy(arr, removedIdx + 1, arr, removedIdx, arr.length - 1 - removedIdx); 
} 

編集:

それは別の良い方法ではない、それは本当に唯一の許容方法です。

コレクションを割り当てる(新しい配列を作成する)には、コレクション(arraycopyを使用してコレクションが行う)を削除してから、削除するたびにtoArrayを呼び出す(2番目の新しい配列を作成する)最適化の問題ではなく、犯罪的に悪いプログラミングです。

たとえば、アレイが100mbのRAMを占有しているとします。今度は反復して20の要素を削除したいと思っています。

は、私はあなたが大きな、またはあなたが削除された場合に、あなたが違っそれをコーディングしたい、一度に多く、私が修正したことを行っていないことを前提と知っている...それを

を試してみて誰かがそのような前提を作ったときのひどいコードです。

+2

「削除」(すなわち、1つの要素だけ左に配列をシフトする)に続いて、最後の要素の複製が存在しないか?つまり、a.lengthは削除後も同じになるでしょうか?私はアイデアを嫌うと言っているわけではなく、ちょうどこれを認識する必要があります。 – Adamski

+0

+1。これは私の目的のために働く。 (あなたのサンプルにあった小さな問題を修正しましたが、あなたが気にしないことを願っています) – Gunslinger47

+0

はい、これは要素を左にシフトし、最後の要素がまだ存在します。 新しい配列を使用してコピーする必要があります。 – Reddy

44

あなたの質問はあまり明確ではありません。あなた自身の答えから、私は何をしようとするよりよく伝えることができます:

public static String[] removeElements(String[] input, String deleteMe) { 
    List result = new LinkedList(); 

    for(String item : input) 
     if(!deleteMe.equals(item)) 
      result.add(item); 

    return result.toArray(input); 
} 

NBを:これはテストされていません。エラーチェックは、読者の練習として残されています(inputまたはdeleteMeがnullの場合、IllegalArgumentExceptionがスローされます; nullリストの入力時に空のリストが意味をなさない場合)配列からヌル文字列を削除することは意味があるかもしれませんが、 LLあまりにも練習として残しておき、それはdeleteMeがnullの場合deleteMeに等しい呼び出そうとした場合、現在、それはNPEをスローします)私がここで行わ

選択肢:

を私がLinkedListのを使用。反復は速くなければなりません。リサイズを避けるか、多くの要素を削除するとリストが大きくなりすぎます。 ArrayListを使用して、初期サイズを入力の長さに設定することができます。それはおそらく大きな違いをもたらさないでしょう。

+2

注意、あなたは 'List '結果を使用したいと思うでしょう。現在のコンパイラでこれを実行すると、toArrayコマンドで型エラーが発生します(他の解決方法は結果をキャストすることです)。 –

4

ArrayUtils APIを使用すると、「いい感じの方法」で削除できます。これは、配列に対して多くの操作(remove、find、add、containsなど)を実装します。
私の人生はもっとシンプルになっています。

8

の質問がありました。コレクションAPIの使用がありません。低レベルの詳細、パフォーマンスの問題、または緩やかに結合されたSOA統合のいずれかを使用します。後で、それらをコレクションに変換し、それをビジネスロジックに渡すことはOKです。

低レベルの性能のものについては、forループなどによる即座で汚れた状態の混乱によって、通常はすでにわかりにくくなっています。その場合、コレクションと配列の間で前後に変換するのは面倒で、資源集中的でもあります。

ところで、TopCoder、誰ですか?常にそれらの配列パラメータ!だから、アリーナにいるときにそれらを処理できるように準備してください。

以下は私の問題の解釈とその解決方法です。機能性は、で与えられるものとは異なる。ビルKおよびjelovirt。また、要素が配列内にない場合は、正常に処理します。

希望に役立ちます!

public char[] remove(char[] symbols, char c) 
{ 
    for (int i = 0; i < symbols.length; i++) 
    { 
     if (symbols[i] == c) 
     { 
      char[] copy = new char[symbols.length-1]; 
      System.arraycopy(symbols, 0, copy, 0, i); 
      System.arraycopy(symbols, i+1, copy, i, symbols.length-i-1); 
      return copy; 
     } 
    } 
    return symbols; 
} 
+1

これは完全に動作しています。 – Reddy

+1

OPとは異なる質問に答える回答が多すぎます。 –

2

いくつかのより多くの前提条件は、ビル・Kによって書かれたもののために必要と

Object[] newArray = new Object[src.length - 1]; 
if (i > 0){ 
    System.arraycopy(src, 0, newArray, 0, i); 
    } 

if (newArray.length > i){ 
     System.arraycopy(src, i + 1, newArray, i, newArray.length - i); 
    } 

    return newArray; 
3

あなたは、配列の長さを変更することはできませんdadinnができますが、インデックスがで保持している値を変更することができています新しい値をコピーして既存のインデックス番号に格納します。 1 = mike、2 = jeff // 10 = george 11はmikeを上書きします。

Object[] array = new Object[10]; 
    int count=-1; 

    public void myFunction(String string) { 
     count++; 
     if(count == array.length) { 
      count = 0; // overwrite first 
     } 
     array[count] = string;  
    } 
+1

配列の長さを変更できないことは重要な点です。 –

関連する問題