Удалить равный элемент из списка Java - PullRequest
3 голосов
/ 20 марта 2012

У меня есть список элементов, где каждый элемент представляет собой простой класс, содержащий 2 открытые строки. У меня есть метод equals, который просто использует метод equalsIgnoreCase String для обеих строк.

public class data
{
    public String a;
    public String b;

    public boolean equals(data d)
    {
        if(a.equalsIgnoreCase(d.a) && b.equalsIgnoreCase(d.b))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Я хочу иметь возможность удалить элемент, даже если он не совпадает с экземпляром в списке, но равен ему.

Прямо сейчас я делаю это:

public void remove(data dataToRemove)
{
    for(data i : _list)
    {
        if(i.equals(dataToRemove))
        {
            _list.remove(i);
            break;
        }
    }
}

Есть ли лучший способ сделать это?

Ответы [ 2 ]

15 голосов
/ 20 марта 2012

Несколько комментариев:

  • Ваш equals метод не не перекрывает equals метод Object (аргумент должен иметь тип Object, а не data тип).
  • Вы должны улучшить свой метод equals для учета нулевых значений и т. Д.
  • И, наконец, вы должны также переопределить hashcode() при переопределении equals() - в противном случае вы можете столкнуться с некоторыми странными поведениями, например, при использовании Sets или Maps.

Если вы правильно переопределите метод equals, вы можете просто использовать метод remove. См. Ниже автоматически сгенерированные equals и hashcode, сгенерированные Netbeans, исправленные для использования метода equalsIgnoreCase.

public static void main(String[] args) {
    List<Data> list = new ArrayList<Data>();
    list.add(new Data("a", "b"));
    list.add(new Data("a", "c"));
    System.out.println(list.size()); //2
    list.remove(new Data("A", "b"));
    System.out.println(list.size()); //1
}

public static class Data {

    public String a;
    public String b;

    public Data(String a, String b) {
        this.a = a;
        this.b = b;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (getClass() != obj.getClass()) return false;
        final Data other = (Data) obj;
        boolean sameA = (this.a == other.a) || (this.a != null && this.a.equalsIgnoreCase(other.a));
        if (!sameA) return false;
        boolean sameB = (this.b == other.b) || (this.b != null && this.b.equalsIgnoreCase(other.b));
        if (!sameB) return false;
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 89 * hash + (this.a == null ? 0 :this.a.toUpperCase().hashCode());
        hash = 89 * hash + (this.b == null ? 0 : this.b.toUpperCase().hashCode());
        return hash;
    }

}
1 голос
/ 20 марта 2012

Самый простой способ - просто вызвать метод Remove из списка без каких-либо циклов и передать в ваш объект параметр.Он использует метод equals, который вы определили для объекта, чтобы найти и удалить его, если он существует в списке.

_list.remove(data);

Вам также не нужно указывать метод хеш-кода, но вы должны получить впривычка всегда создавать его, когда вы переопределяете метод equals, если вы используете его в коллекции, такой как Set или Map.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...