2015-08-09 2 views
0

Я реализовать equals(), чтобы иметь возможность удалить список элементов массива по значению:Удалить из ArrayList по значению

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

И это мой ArrayList:

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

содержит:

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

Я собираюсь удалить a и b символов:

public static removeChars(){ 

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

} 

Но всегда две последние детали (g и f) был удален.

+0

Является ли 'Символ' пользовательским классом, который вы написали (или это' java.lang.Character'?). Какой класс содержит метод 'equals', который вы опубликовали? –

+0

@MickMnemonic похоже, что он отключен при вызове 'remove', поэтому означает, что он должен быть' java.lang.Character' правильным? Хотя я не уверен, почему в этом случае OP использует пользовательский 'equals'. – sprinter

+0

Да, это похоже на 'removeChars', что заставляет меня задаться вопросом, где находится реализация' equals'. Похоже, в этом вопросе опущено большое количество соответствующего кода. –

ответ

2

Если вы используете java.lang.Character в своем ArrayList, тогда вам не нужно использовать equals. Если это ваш собственный Character, то вызов remove не создает объекты вашего класса - он создает стандартные объекты Character, поэтому они не equal элементов в списке.

Если это проблема, то вам необходимо убедиться, что вы передать экземпляры своего класса на призыв к remove, а не полагаться на autoboxing:

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

Кроме того, если вы используете Java 8 можно явно реализовать equalsChar метод и называют его в предикате:

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

Это имеет то преимущество, что удаление всех экземпляров (не только первый), который часто, что требуется для List, а не Set.

Смежные вопросы