当前位置: 首页 > 知识库问答 >
问题:

将对象添加到ArrayList-获取了n倍于上次找到的对象

郜琦
2023-03-14

一、 我的项目有问题。当我从文件中读取游戏地图时,我试图将16个对象(建筑)添加到ArrayList。毕竟,我得到了16个相同的物体(最后一个在地图上找到的建筑),我不知道为什么。。。

在课堂游戏中创建ArrayList:

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

阅读地图(类地图)[地形进入阵列,建筑如果找到,进入阵列列表]:

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

在屏幕上渲染地图(clas Map):

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

我还尝试在List上迭代如下:

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

而且它也不起作用。

类Map中的方法:

b.writeBuilding();

当我将其写入NetBeans控制台时,它为我提供了正确的字段值,但它始终在添加相同的值。

类地形:

package game;

class Terrain {
private int ssX;
private int ssY;
private int x;
private int y;
private boolean occupied;
private boolean crossable;

Terrain() {
    this.occupied = false;
}

public void setSSX(int ssX) {
    this.ssX = ssX;
}

public void setSSY(int ssY) {
    this.ssY = ssY;
}

public void setX(int x) {
    this.x = x;
}

public void setY(int y) {
    this.y = y;
}

public int getSSX() {
    return ssX;
}

public int getSSY() {
    return ssY;
}

public int getX() {
    return x;
}

public int getY() {
    return y;
}

public void setCrossable() {
    if(ssX == 2 && ssY == 2) {
        this.crossable = false;
    } else {
        if(ssX >= 6 && ssX <= 11) {
            if(ssY >= 1 && ssY <= 2) {
                this.crossable = false;
            } else {
                this.crossable = true;
            }
        }
    }
}
}

班级建设:

package game;

public class Building {
private static int owner;
private static int type;
private static int x;
private static int y;
private static int ssX;
private static int ssY;

public Building(int x, int y, int type, int owner) {
this.owner = owner;
this.type = type;
this.x = x;
this.y = y;

if(this.owner == 0) {
    if(this.type == 2) {
    this.ssX = 4;
    this.ssY = 4;
    } else if(this.type == 3) {
    this.ssX = 4;
    this.ssY = 3;
    }
} else if(this.owner == 1) {
    if(this.type == 1) {
    this.ssX = 1;
    this.ssY = 3;
    } else if(this.type == 2) {
    this.ssX = 2;
    this.ssY = 3;
    } else if(this.type == 3) {
    this.ssX = 3;
    this.ssY = 3;
    }
} else if(this.owner == 2) {
    if(this.type == 1) {
    this.ssX = 1;
    this.ssY = 4;
    } else if(this.type == 2) {
    this.ssX = 2;
    this.ssY = 4;
    } else if(this.type == 3) {
    this.ssX = 3;
    this.ssY = 4;
    }
}
}

public int getX() {
return x;
}
public int getY() {
return y;
}
public int getSSX() {
return ssX;
}
public int getSSY() {
return ssY;
}

public void writeBuilding() {
System.out.format("Owner: %d Type: %d X: %d Y: %d SSX: %d SSY %d\n"
    ,this.owner,this.type,this.x,this.y,this.ssX,this.ssY);
}
}

有什么想法吗?提前谢谢你的帮助

共有1个答案

蓝宜
2023-03-14

建筑使用静态字段,每次初始化一个对象时,这些字段都会被覆盖,所以最终所有字段都是相等的。

 类似资料:
  • 问题内容: 我认为这是一个非常简单的问题,但我不知道如何正确执行此操作。 我有一个空的arraylist: 我有一些要添加的对象,每个对象必须位于某个位置。但是,有必要可以按每种可能的顺序添加它们。当我尝试此操作时,它不起作用,我得到了: 我曾尝试是填充用,然后做以上。它有效,但是我认为这是一个可怕的解决方案。还有另一种方法吗? 问题答案: 您可以这样做: 将对象2添加到位置2后,它将把对象3移动

  • 我想编写一个名为addNewPhone(Phone newPhone)的方法,将一个Phone添加到一个电话数组列表中; 电话类别: 车间类别: 主要类: 我知道我需要返回ArrayList,并且我需要在这个方法中接收Phone type对象,然后它应该返回ArrayList和一个新的phones,但我不知道为什么它不起作用。 Eclipse显示我符合的方法:“newPhone无法解析或未归档”。

  • “Bericht”对象的单独类文件的一部分(荷兰语表示消息,包含一个字符串和两个日期): 在我的主方法的某个地方,我从这个类中创建新对象: 方法“printberichten”迭代数组列表并打印所有消息 getBericht getter方法: 因此,如果我创建一个新对象,我之前的所有对象都应该显示在text Area中,但我似乎只创建了我的类的一个实例。 在命令“lijst.add(this)”

  • 问题内容: 我想向中添加一个对象,但是每次我向具有3个属性的新对象添加时,都会出现错误。 在这里,我正在尝试创建其对象并将其传递给的类。 问题答案: 创建对象时需要使用运算符 要不然 并且您的构造函数不应包含。否则它将成为您班上的一个方法。

  • 问题内容: 如果我有一个ArrayList,并向其中添加了一个对象,后来又修改了该对象,此更改是否会反映在ArrayList中?还是将对象添加到ArrayList时,Java创建了一个副本并将其添加到ArrayList? 如果将对此对象的引用更改为null怎么办?这是否意味着ArrayList中的对象现在也为空? 问题答案: 这个变化会反映在ArrayList中吗? 是的,因为您在列表中添加了对该

  • 问题内容: 我有一个特定的类C的arraylist。 C类具有两个属性,即。 现在,当我将C类型的对象添加到ArrayList myList时,我想检查列表中是否已经存在对象,且其str1和str2的值与该对象的参数值(str1和str2)相匹配我要补充。 有什么有效的方法可以执行此操作,而不必每次都遍历完整列表并检查参数之间是否匹配? 问题答案: 您需要重写C类中的方法。 例如 然后,可以调用m