2015-08-09 3 views
0

je mets en œuvre la equals() de pouvoir supprimer un des éléments de la liste de tableau par valeur:Retirer du arraylist en valeur

public boolean equals(Object obj) { 
    if (obj == null) return false; 
    if (obj == this) return true; 
    if (!(obj instanceof Character)) return false; 
    Character ch = (Character) obj; 
    return ch.equals(this); 
} 

Et voici mon arraylist:

static ArrayList<Character> sr = new ArrayList<Character>(); 

contient:

Sr: [a, b, c, d, e, f, g] 

Je vais retirer a et b caractères:

public static removeChars(){ 

    ... 
    sr.remove('a'); 
    sr.remove('b'); 

} 

Mais toujours deux derniers articles (g et f) ont été supprimés.

+0

Est-ce que 'Character' est une classe personnalisée que vous avez écrite (ou est-ce' java.lang.Character'?). Quelle classe contient la méthode 'equals' que vous avez publiée? –

+0

@MickMnemonic On dirait qu'il est autoboxé dans l'appel de 'remove', ce qui signifie qu'il doit être' java.lang.Character', n'est-ce pas? Bien que je ne sois pas sûr pourquoi OP est en train d'implémenter un 'equal 'personnalisé dans ce cas. – sprinter

+0

Oui, cela semble être le cas dans 'removeChars', ce qui me fait me demander où réside l'implémentation' equals'. Il semble que beaucoup de code pertinent a été omis de la question. –

Répondre

2

Si vous utilisez java.lang.Character dans votre ArrayList, vous ne devez pas implémenter equals. Si c'est votre propre Character alors l'appel à remove ne crée pas d'objets de votre classe - il crée des objets Character standard, c'est pourquoi ils ne equal les éléments de la liste.

Si tel est le problème, alors vous devez vous assurer que vous passez des instances de votre classe à l'appel à remove plutôt que de compter sur autoboxing:

sr.remove(new Character('a')); 

Alternativement, si vous utilisez Java 8, vous pouvez mettre en œuvre explicitement une equalsChar méthode et l'appeler dans un prédicat:

sr.removeIf(c -> c.equalsChar('a')); 

Cela a l'avantage d'éliminer tous les cas (et pas seulement le premier) qui est souvent ce qui est nécessaire pour une List plutôt qu'un Set.