Cześć,
Potrzebuję pomocy z HashMapą. Pewnie jako początkujący czegoś tu nie widzę..
Jest klasa abstrakcyjna AbstractWorldMap:
public abstract class AbstractWorldMap{
private Map<Vector2d, ArrayList<IMapElement>> objectsOnMap;
public AbstractWorldMap(int width, int height){
(...)
this.objectsOnMap = new HashMap<>();
}
@Override
public boolean place(IMapElement mapElement) {
ArrayList<IMapElement> newElement = this.objectsOnMap.getOrDefault(mapElement.getPosition(), new ArrayList<>());
if (newElement.size() == 0){
newElement.add(mapElement);
} else{
if (!isOccupied(mapElement.getPosition())){ //zwraca true jeśli na danej pozycji jest obiekt, false - jeśli nic nie ma
newElement.add(mapElement);
}
}
objectsOnMap.put(mapElement.getPosition(), newElement);
return true;
}
@Override
public boolean isOccupied(Vector2d position){
Set<Vector2d> positionKeys = objectsOnMap.keySet();
for (Vector2d p : positionKeys){
if (p.equals(position)){
for (IMapElement mapElement : objectsOnMap.get(p)) {
if (mapElement instanceof Animal) {
return true;
}
}
}
}
return false;
}
@Override
public IMapElement objectAt(Vector2d position) {
return printFirst(objectsOnMap.get(position)); // <----------- zwraca pustą ArrayList
}
}
i teraz - metodą place dodaję obiekt do mapy i w mapie mam np: <(2, 2); lista obiektów> - czyli na współrzędnych (2,2) dodałem obiekt (do ArrayList).
Klucz (pozycje, współrzędne to prosta klasa:
public class Vector2d {
private final int x;
private final int y;
public Vector2d(int x, int y){
this.x = x;
this.y = y;
}
public boolean equals(Vector2d other){
return this.x == other.x && this.y == other.y;
}
@Override
public int hashCode() {
return Objects.hash(this.x, this.y);
}
Metoda isOccupied dla zadanego Vector2d zwraca mi TRUE. W debuggerze widzę też, że jest wartość - lista obiektów dla tego klucza. Natomiast chwilę potem kiedy wywołuję metodę objectAt - objectsOnMap.get(position) zwraca null... Dlaczego?