У меня есть список объектов. Объект выглядит примерно так:Как фильтровать список с помощью пользовательского равенства
class Data {
...
private X somethig;
private Y somethigElse;
public boolean customEquals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof Data)) {
return false;
}
Data other = (Data) obj;
if (something == null) {
if (other.something != null) {
return false;
}
} else if (!something.equals(other.something)) {
return false;
}
if (somethigElse == null) {
if (other.somethigElse != null) {
return false;
}
} else if (!somethigElse.equals(other.somethigElse)) {
return false;
}
return true;
}
public boolean equals(Object obj) {
...
}
public int hashCode() {
...
}
getters/setters
}
Мне нужно отфильтровать список, чтобы получить от него отдельные объекты.
Обратите внимание, что методы equals и hashCode реализованы (они используют другие поля), и я не могу использовать equals для этой задачи. Таким образом, равенство не определяется равными, а свойствами «что-то» и «somethigElse». Как я могу это сделать?
Я попытался:
final Comparator<Data> comparator = new Comparator<Data>() {
@Override
public int compare(Data o1, Data o2) {
return o1.customEquals(o2) ? 0 : 1;
}
};
Set<Data> set = new TreeSet<Data>(comparator);
set.addAll(list);
System.out.println(set);
Но множество еще содержит некоторые объекты в несколько раз.
Тот факт, вы сделали * somethig * и * somethigelse * частные переменные члены делает меня съежиться - но я получаю точку: D – jdero
Ваш сравнить метод сломанный , Для двух объектов, которые не равны, оба сравнения (a, b) и compare (b, a) возвращают положительное значение. Это делает поведение вашего TreeSet неопределенным. – Buhb
Можете ли вы переубедить equals(), чтобы использовать что-то и что-то еще? Кроме того, если вы хотите только отдельные объекты, почему бы не использовать Set? – NickJ