2013-06-20 14 views
10

In un test come questo:java: Elenco dei String Arrays e rimuovere

@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()); 
    } 

la seconda affermazione (= 2) fallisce come equals/hashcode utilizzato in list.remove sono il default per oggetto. C'è un modo per rendere l'elenco in grado di utilizzare Arrays.equals/Arrays.hashcode per confrontare gli array? Oppure l'unica soluzione è il wrapping degli array di stringhe in un oggetto e l'override di equals/hashcode?

risposta

6

Utilizzando Guava, c'è. Sarà necessario implementare un 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); 
    } 
} 

Si sarebbe quindi bisogno di avere la vostra lista essere un List<Equivalence.Wrapper<String[]>>, e inserire/rimuovere/etc utilizzando le Equivalence 's .wrap() metodo:

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

Usa Guava . Ripeti dopo di me. Uso Guava: p

+1

Ok! Userò GUAVA! GUAIAVA! GUAVAAAAAAAAAAAAAAAAAAAAAAAAAAAAA! Grazie :) – Randomize

4

Si sta creando un nuovo riferimento all'oggetto e lo si passa al metodo remove(). Dai dati che hai postato, sembra che tu possa creare una classe personalizzata con due proprietà e sovrascrivere il suo equals() e hashCode() invece di memorizzarli come String[] OPPURE Conservare il riferimento all'oggetto String[] inserito e utilizzare tale riferimento per rimuoverlo.

+2

+1 per aver suggerito un 'String []' potrebbe non essere appropriato –

2

Il metodo List si basa spesso sul metodo Objectequals(Object o) che confronta il riferimento dell'oggetto per impostazione predefinita. È possibile memorizzare sulla scheda, se si desidera rimuoverla più tardi, o creare la propria classe ed eseguire l'override 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

No, nel mio caso ho esattamente una nuova stringa Array con stessi valori. Quindi il "default" Object.equals/hashcode non funzionerà – Randomize

+0

Sì, è stato quello che ho scritto nella mia domanda e vorrei evitare che, se possibile, – Randomize

0

A proposito, Java 8 introduce un nuovo metodo removeIf che rimuove tutti gli elementi di questa collezione che soddisfano la data predicato

Può essere usato per rimuovere facilmente un array di stringhe dalla lista:

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));