2013-06-20 6 views
10

を削除:のJava:文字列配列のリスト及びこのような試験で

@Test 
    public void test() { 
     List<String[]> l = new LinkedList<String[]>(); 
     l.add(new String [] {"test", "123"}); 
     l.add(new String [] {"test", "456"}); 
     l.add(new String [] {"test", "789"}); 

     assertEquals(3, l.size()); 

     l.remove(new String [] {"test", "456"}); 

     assertEquals(2, l.size()); 
    } 

第アサーション(= 2)list.removeに使用equals/hashcodeは、オブジェクトのdefaultであるとして失敗します。 リストでArrays.equals/Arrays.hashcodeを使用して配列を比較できるようにする方法はありますか?または、唯一の解決策は、文字列配列をオブジェクトにラップし、equals/hashcodeをオーバーライドすることですか?

答えて

6

グァバを使用して、そこにあります。あなたはEquivalence<String[]>を実装する必要があります。

public final class MyEquivalence 
    extends Equivalence<String[]> 
{ 
    @Override 
    protected boolean doEquivalent(final String[] a, final String[] b) 
    { 
     return Arrays.equals(a, b); 
    } 

    @Override 
    protected int doHash(final String[] t) 
    { 
     return Arrays.hashCode(t); 
    } 
} 

あなたは、あなたのEquivalence.wrap()方法使用など/あなたのリストは、List<Equivalence.Wrapper<String[]>>されていて、挿入/削除する必要があります:

final Equivalence<String[]> eq = new MyEquivalence(); 
list.add(eq.wrap(oneValue)); 
list.remove(eq.wrap(anotherValue)); 

使用グアバを。私の後に繰り返して。使用グァバ:ところで、P

+1

Ok!私はGUAVAを使用します!グアバ! GUAVAAAAAAAAAAAAAAAAAAAAAAAAAAAA!ありがとう:) – Randomize

4

新しいオブジェクト参照を作成し、remove()メソッドに渡します。投稿したデータから、2つのプロパティを持つカスタムクラスを作成し、String[]として保存するのではなく、equals()hashCode()を上書きするか、またはString[]オブジェクトへの参照を挿入したままにして削除するように見えます。

+2

+1「String []」が適切でない可能性があります。 –

2

Listのメソッドは、多くの場合、オブジェクトの参照をデフォルトで比較するequals(Object o)メソッドObjectに基づいています。 あなたは後でそれを削除したい場合は、タブを保存したり、独自のクラスを作成し、equals(Object o)を無効にすることができる;)

@Test 
    public void test() { 
     List<String[]> l = new LinkedList<String[]>(); 
     l.add(new String [] {"test", "123"}); 
     String[] tab = new String [] {"test", "456"}; 
     l.add(tab); 
     l.add(new String [] {"test", "789"}); 

     assertEquals(3, l.size()); 

     l.remove(tab); 

     assertEquals(2, l.size()); 
    } 
+0

いいえ、私の場合は、まったく同じ値の新しい配列文字列を持っています。したがって、 "default" Object.equals/hashcodeは機能しません。 – Randomize

+0

はい、それは私の質問で書いたものでした。可能ならば避けたいです。 – Randomize

0

、Javaの8はは、簡単に文字列の配列を除去するために使用することができます与えられた述語

を満たすこのコレクションのすべての要素を削除し、新たなremoveIf方法を紹介します

List<String[]> l = new LinkedList<String[]>(); 
l.add(new String [] {"test", "123"}); 
l.add(new String [] {"test", "456"}); 
l.add(new String [] {"test", "789"}); 

String[] newArray = new String[] {"test", "456"}; 
l.removeIf(array -> Arrays.equals(array, newArray));