Jak sprawdzić, czy obiekt o danych unikatowych parametrach znajduje się w ArrayList

0

Dodaję do pewnej listy ArrayList obiekty utworzonej przeze mnie klasy Box, z dwoma parametrami - X i Y, w następujący sposób:
openList.add(new Box(X,Y));
W jednej z metod potrzebować będę sprawdzenia (w warunku pętli if), czy obiekt o podanych parametrach X i Y istnieje na tej liście, by go z niej usunąć. Znalazłem coś takiego, jak metoda "contains" ale nie mam pomysłu, jak jej użyć skoro na liście znajdują się obiekty anonimowe. Istnieje w ogóle metoda na szybkie sprawdzenie tego, czy konieczne jest pisanie nowej metody sprawdzającej to "na okrętkę" ?

0

contains() używa Object.equals() więc musisz nadpisać tą metodę w swojej klasie Box.

PS. W Javie nie istnieje coś takiego jak obiekt anonimowy. W Javie istnieje klasa anonimowa i to nie jest to co zaprezentowałeś.

1

Jeżeli nie posiadasz referencji do obiektu oraz masz potrzebne do znalezienia dane - x, y (i nawet jeżeli masz zaimplementowane equals i hashcode) to powinieneś nie korzystać z contains. Lepszym rozwiązaniem jest po prostu przeszukać listę w taki sposób

public class Main {
    private static List<Box> boxes = new ArrayList<>();

    public static void main(String[] args) {
        boxes.add(new Box(10,20));
        boxes.add(new Box(15,22));
        boxes.add(new Box(21,22));

        System.out.println(isBoxPresentInList(21, 22)); //true
        System.out.println(isBoxPresentInList(15, 22)); // true
        System.out.println(isBoxPresentInList(10, 22)); // false
        System.out.println(isBoxPresentInList(99, 99)); // false


    }

    public static boolean isBoxPresentInList(int x, int y) {
        return boxes.stream()
                .anyMatch(box -> box.getX() == x && box.getY() == y);
    }
}

Edit: Usuwanie elementu z listy:

public class Main {
    private static List<Box> boxes = new ArrayList<>();

    public static void main(String[] args) {
        boxes.add(new Box(10,20));
        boxes.add(new Box(15,22));
        boxes.add(new Box(21,22));

        boxes.add(new Box(10,20));
        boxes.add(new Box(15,22));
        boxes.add(new Box(21,22));

        System.out.println(removeBox(10, 20));  //true
        System.out.println(removeBox(10, 20)); //Exception in thread "main" java.lang.IllegalArgumentException: Box with given values X(10) and Y(20) does not exist
        System.out.println(removeBoxSafe(15, 22)); // true
        System.out.println(removeBoxSafe(15, 22)); // false


      
    }

    public static boolean removeBox(int x, int y) {
        Box box = boxes.stream()
                .filter(e -> e.getX() == x && e.getY() == y)
                .findAny()
                .orElseThrow(() -> new IllegalArgumentException(String.format("Box with given values X(%s) and Y(%s) does not exist", x, y)));

        return boxes.remove(box);

    }

    public static boolean removeBoxSafe(int x, int y) {
        return boxes.stream()
                .filter(e -> e.getX() == x && e.getY() == y)
                .findAny()
                .map(box -> boxes.remove(box))
                .isPresent(); // lub .orElse(Boolean.FALSE); jeżeli chcesz mieć wiedze na temat rezultatu metod remove

    }
}
0

Jeżeli pola są publiczne możesz łatwo poradzić sobie bazując na samych wartościach pół, ale nie polecam.
Poniżej masz przykład

public class Example {

    public static void main(String[] args) {

        class Box {
            public final Double X;
            public final Double Y;

            public Box(Double x, Double y) {
                X = x;
                Y = y;
            }

            @Override
            public boolean equals(Object o) {
                if (this == o) return true;
                if (o == null || getClass() != o.getClass()) return false;
                Box box = (Box) o;
                return Objects.equals(X, box.X) &&
                        Objects.equals(Y, box.Y);
            }

            @Override
            public int hashCode() {
                return Objects.hash(X, Y);
            }

            @Override
            public String toString() {
                return String.format("Box {X: %s, Y; %s}", X, Y);
            }
        }


        List<Box> boxes= Arrays.asList(new Box(1., 1.), new Box(2.5, 3.), new Box(1.1, 4.));

        // Without equals
        List<Box> filteredBoxes1 = boxes.stream()
                .filter(box -> !(box.X == 1. && box.Y == 1.))
                .collect(Collectors.toList());

        filteredBoxes1.stream()
                .forEach(fb -> System.out.println(fb));


        // With equals
        List<Box> filteredBoxes2 = boxes.stream()
                .filter(box -> !box.equals(new Box(1., 1.)))
                .collect(Collectors.toList());

        filteredBoxes2.stream()
                .forEach(fb -> System.out.println(fb));

    }

}

1 użytkowników online, w tym zalogowanych: 0, gości: 1