Dodawanie elementów do ArrayList - dodaje się n razy ostatni...

Dodawanie elementów do ArrayList - dodaje się n razy ostatni...
AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
0

Witam, mam problem ze swoim projektem. Próbuję wczytać 16 elementów do ArrayList. 16 elementów się wczytuje, ale jak próbuję je wypisać to 16 razy wypisuje się ostatni element... Nie za bardzo rozumiem gdzie jest błąd i już nie mam pomysłów jak go poprawić...

Deklaracja ArrayList w klasie Game:

Kopiuj
public static ArrayList<Building> buildingList = new ArrayList<>();

Metody w klasie Map do wczytywania mapy (terenu do tablicy) oraz budynków (na listę):

Kopiuj
    private void readBuilding(Terrain objct, int x, int y) {
	System.out.format("Dodaję: ");
	//Czerwone centrum dowodzenia
	if(objct.getSSX() == 1 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 1, 1);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Czerwona miasto
	if(objct.getSSX() == 2 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 2, 1);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Czerwona fabryka
	if(objct.getSSX() == 3 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 3, 1);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niebieskie centrum dowodzenia
	if(objct.getSSX() == 1 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 1, 2);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niebieska fabryka
	if(objct.getSSX() == 2 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 2, 2);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niebieskie miasto
	if(objct.getSSX() == 3 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 3, 2);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niczyje miasto
	if(objct.getSSX() == 4 && objct.getSSY() == 3) {
	    Building b = new Building(x, y, 3, 0);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
	//Niczyja fabryka
	if(objct.getSSX() == 4 && objct.getSSY() == 4) {
	    Building b = new Building(x, y, 2, 0);
	    b.writeBuilding();
	    Game.buildingList.add(b);
	}
    }
    
    private void createMap() {
	map = new Terrain[40][22];
	String[] fields = csvFileContent.split(";");
	int x, y;
	int fieldNo = 0;
	
	for(y = 0; y < 22; y++) {
	    for(x = 0; x < 40; x++) {	    
		Terrain objct = new Terrain();
		objct.setSSX(Integer.parseInt(fields[fieldNo].substring(0,2)));
		objct.setSSY(Integer.parseInt(fields[fieldNo].substring(2,4)));
		if(objct.getSSY() > 2) {
		    readBuilding(objct, x, y);
		    objct.setSSX(3);
		    objct.setSSY(1);
		}
		fieldNo++;
		map[x][y] = objct;
	    }
	}
	System.out.format("Elementow: %d\n",Game.buildingList.size());
	for(Building b : Game.buildingList) {
	    b.writeBuilding();
	}
    }

Metoda klasy Map, renderująca mapę (czyli osobno teren (tablicę) i osobno budynki (z listy))

Kopiuj
public void render(Graphics graphics, Game game) {
        int x, y;
	//System.out.println("Budynkow: " + game.getBuildingList().size());
        for(y = 0; y < 22; y++) {
            for(x = 0; x < 40; x++) {
                field = ss.grabImage(map[x][y].getSSX(), map[x][y].getSSY(), 32, 32);
                graphics.drawImage(field, x*32, y*32, null);
            }
        }
	Iterator<Building> it = Game.buildingList.iterator();
	while(it.hasNext()) { 
	    Building b = it.next();
	    field = ss.grabImage(b.getSSX(), b.getSSY(), 32, 32);
	    graphics.drawImage(field, b.getX()*32, b.getY()*32, null);
	}
    }

Cała tablica "terenu" poprawnie się wypisuje na ekran.
Problem w tym, że na ekranie rysuje mi się tylko i wyłącznie ostatni znaleziony element (budynek)...
Budynek się renderuje poprawnie i w odpowiednim miejscu, ale co z resztą?
Dodam, że próbowałem również w ten sposób przechodzić po liście:

Kopiuj
for(Building b : Game.buildingList) {
	field = ss.grabImage(b.getSSX(), b.getSSY(), 32, 32);
	graphics.drawImage(field, b.getX()*32, b.getY()*32, null);
}

Również to nic nie dało.
Wskazówka - w metodzie readBuilding() mam takie linijki:

Kopiuj
b.writeBuilding();

przed dodaniem każdego elementu. Czyli wypisuję wartości wszystkich pól danej instancji na konsolę w NetBeans-ie. I wartości pól w obiektach się zgadzają. A i tak dodaje się coś innego, ponieważ jak próbuję wypisać całą listę to wypisuje mi jako kolejne elementy, ten sam budynek.

Bardzo proszę o pomoc. Za wszelkie pomysły i sugestie z góry serdecznie dziękuję!
Pozdrawiam!

Wibowit
  • Rejestracja:około 20 lat
  • Ostatnio:minuta
0
  1. zapnij się debuggerem na początku metody render
  2. jak program się tam zatrzyma to sprawdź zawartość tablic/ kolekcji, które cię interesują
  3. napisz co zauważyłeś

"Programs must be written for people to read, and only incidentally for machines to execute." - Abelson & Sussman, SICP, preface to the first edition
"Ci, co najbardziej pragną planować życie społeczne, gdyby im na to pozwolić, staliby się w najwyższym stopniu niebezpieczni i nietolerancyjni wobec planów życiowych innych ludzi. Często, tchnącego dobrocią i oddanego jakiejś sprawie idealistę, dzieli od fanatyka tylko mały krok."
Demokracja jest fajna, dopóki wygrywa twoja ulubiona partia.
AR
Lista wypełnia się obiektami z tymi samymi wartościami... Czyli tak jakby jeden budynek 16 razy na listę dodało.
Wibowit
no dobra, to teraz za pomocą debuggera sprawdź, czy zawartość tablicy tuż po wypełnieniu jest taka sama jak przed renderowaniem
AR
Jest taka sama - błędna. Co więcej, zauważyłem, że: Mam na liście jeden element ze współrzędnymi np. X: 1 Y: 1. Znajduję kolejny element X:2 Y:2, dodaję go na listę i nagle zarówno pierwszy jak i drugi element ma wartości x:2 Y:2. Potem znajduję trzeci element x:3 Y:3. Dodaję na listę i teraz wszystkie trzy mają wartości X:3 Y:3...
AR
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 11 lat
  • Postów:25
0

Dobra, wiem już co było źle. W klasie Building miałem statyczne pola, które przy tworzeniu nowych instancji tej klasy się nadpisywały. Więc jak tworzyłem nowy element i dodawałem go do listy to poprzednie na liście zmieniały wartości na takie, które ustawiłem w nowym.
Mimo wszystko dziękuję za próbę pomocy. ;)

Wibowit
No to masz nauczkę, by unikać statycznego mutowalnego stanu jak ognia. Takiego czegoś powinno być jak najmniej.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.