Удаление пользовательских объектов из Arraylist и возврат чистого arrayList - PullRequest
0 голосов
/ 19 июня 2020

Кажется, я не понимаю, как я могу удалить повторяющиеся объекты из arrayList. У меня есть следующий метод, но он не работает.

    private ArrayList<Road> removeDuplicates(ArrayList<Road> array, int useless) {
        ArrayList<Road> arrayFixed = new ArrayList<>();
        for (Road road : array) {
            if (!arrayFixed.contains(road)) {
                System.out.println("Im adding this road");
                System.out.println("Road X: " + road.getX());
                System.out.println("Road Y: " + road.getY());
                arrayFixed.add(road);
            }
        }

        return arrayFixed;
    }

У меня есть ArrayList с дорогами (Object), которые могут иметь дубликаты, и я хочу, чтобы метод возвращал ArrayList без этих дубликатов.

Это класс дороги

public class Road {
    private double x;
    private double y;
    private String imgPath;
    private String color;

Ответы [ 2 ]

3 голосов
/ 19 июня 2020

Проблема с вашим кодом не в методе removeDuplicates. Вместо этого, вероятно, это метод equals в классе Road. List.contains(...) использует этот метод equals для сравнения, содержит ли список данный элемент. Итак, чтобы ваш код работал должным образом, вы должны переопределить метод equals в классе Road, чтобы выполнить необходимое сравнение. В зависимости от реализации класса Road это может выглядеть, например, так:

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Road road = (Road) o;
    return Objects.equals(road.x, x) &&
            Objects.equals(road.y, y) &&
            Objects.equals(imgPath, road.imgPath) &&
            Objects.equals(color, road.color);
}

@Override
public int hashCode() {
    return Objects.hash(x, y, imgPath, color);
}

Как уже отмечалось в комментариях, эти методы обычно генерируются с использованием вашей IDE и корректируются только при необходимости. При их настройке вы должны учитывать, что существует контракт (который можно найти в документации) между равными и хэш-кодом, который необходимо учитывать по разным причинам (например, с использованием хэш-наборов).

2 голосов
/ 19 июня 2020

Убедитесь, что вы переопределили методы equals и hashCode в классе, Road что-то вроде:

@Override
public boolean equals(Object obj) {
    Road other = (Road) obj;
    return Objects.equals(imgPath, other.imgPath) && Objects.equals(color, other.color)
            && Objects.equals(x, other.x) && Objects.equals(y, other.y);
}

@Override
public int hashCode() {
    return Objects.hash(imgPath, color, x, y);
}

Кроме того, вместо того, чтобы писать так много строк в вашем методе, вы можете написать всего одна строка с использованием Stream API следующим образом:

private List<Road> removeDuplicates(List<Road> array) {
    return array.stream().distinct().collect(Collectors.toList());
}
...