2013-06-20 10 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/hashcodedefault爲對象失敗。 有沒有辦法讓列表能夠使用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); 
    } 
} 

然後,您就需要有你的列表是一個List<Equivalence.Wrapper<String[]>>,並插入/刪除/等使用Equivalence.wrap()方法:

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

使用番石榴。跟着我重複一遍。使用番石榴:P

+1

好吧!我會使用GUAVA!番石榴! GUAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!謝謝 :) – Randomize

4

您正在創建一個新的對象引用並將其傳遞給remove()方法。從發佈的數據看來,您可以創建具有兩個屬性的自定義類並覆蓋它的equals()hashCode(),而不是將它們存儲爲String[]或保留對插入的String[]對象的引用,並使用該引用進行刪除。

+2

+1暗示了'的String []'可能不適合 –

2

List方法通常基於Object方法equals(Object o)默認情況下比較對象的引用。 您可以存儲選項卡,如果你想以後刪除它,或者創建自己的類並覆蓋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

不,在我的情況我也正好與相同的價值觀的新Array字符串。所以「默認」Object.equals /哈希碼將不起作用 – Randomize

+0

是的,這是我在我的問題中寫的,我想避免,如果可能 – Randomize

0

順便提一下,爪哇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)); 
相關問題