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