Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在一个列表中更改值会在一个单独的列表中更改它_Java_List - Fatal编程技术网

Java 在一个列表中更改值会在一个单独的列表中更改它

Java 在一个列表中更改值会在一个单独的列表中更改它,java,list,Java,List,我试图将数组normMap中的一个值更改为另一个值,但这样做也会更改数组fireMap中的一个值 public int boardX = Board.boardX; public int boardY = Board.boardY; public int tileSizeX = Board.tileSizeX; public int tileSizeY = Board.tileSizeY; public int curr_dimension = Board.current_dimension;

我试图将数组normMap中的一个值更改为另一个值,但这样做也会更改数组fireMap中的一个值

public int boardX = Board.boardX;
public int boardY = Board.boardY;
public int tileSizeX = Board.tileSizeX;
public int tileSizeY = Board.tileSizeY;
public int curr_dimension = Board.current_dimension;

public BufferedImage[] grassImage = {Board.norm.grassImage, Board.fire.grassImage};
public BufferedImage[] waterImage = {Board.norm.waterImage, Board.fire.waterImage};
public BufferedImage[] pathVImage = {Board.norm.pathVImage, Board.fire.pathVImage};
public BufferedImage[] pathHImage = {Board.norm.pathHImage, Board.fire.pathHImage};
public BufferedImage[] treeImage =  {Board.norm.treeImage, Board.fire.treeImage};

// y/x/tile type
public List<List<Integer>> normMap = new ArrayList<List<Integer>>();
public List<List<Integer>> fireMap = new ArrayList<List<Integer>>();

@Override
public void mouseClicked(MouseEvent arg0) 
{
    int y = (int) Math.ceil((arg0.getY() + boardY * tileSizeY) / 32);
    int x = (int) Math.ceil((arg0.getX() + boardX * tileSizeX) / 32);
    switch(curr_dimension)
    {
    case(0): normMap.get(y).set(x, 0); break;
    case(1): fireMap.get(y).set(x, 0); break;
    }
}

@Override
public void keyPressed(KeyEvent arg0) 
{
    switch(arg0.getKeyCode())
    {
    case(KeyEvent.VK_ENTER): writeFile(); break;
    case(KeyEvent.VK_ESCAPE): GameStateManager.setState(GameStateManager.MENU_STATE); break;
    case(KeyEvent.VK_UP): boardY--; break;
    case(KeyEvent.VK_DOWN): boardY++; break;
    case(KeyEvent.VK_LEFT): boardX--; break;
    case(KeyEvent.VK_RIGHT): boardX++; break;
    case(KeyEvent.VK_1): curr_dimension = 0; break;
    case(KeyEvent.VK_2): curr_dimension = 1; break;
    }

}

public String getPrefix(int dimension)
{
    switch(dimension)
    {
    case(0): return "norm";
    case(1): return "fire";
    default: 
        System.out.println("Incorrect dimension, " 
    + dimension + ". Find the map in maps/custom/unidentified."); 
        return "unidentified";
    }
}

public void writeFile()
{
    List<List<Integer>> map;

    switch(curr_dimension)
    {
    case(0): map = normMap; break;
    case(1): map = fireMap; break;
    default: map = normMap; break;
    }
    PrintWriter writer;
    try 
    {
        for(int i = 0; i < 2; i++)
        {
            writer = new PrintWriter("/maps/custom/" + getPrefix(i) + "map1.txt", "UTF-8");
            for(List<Integer> list : map)
            {
                for(int integer : list)
                {
                    writer.print(integer + " ");
                }
                writer.println("");
            }
            writer.close();
        }
    }
    catch (Exception e) 
    {
        e.printStackTrace();
    }
}

@Override
public void init() 
{
    Main.panel.addKeyListener(this);
    Main.panel.addMouseListener(this);

    for(int i = 0; i < 50; i++)
    {
        List<Integer> map1 = new ArrayList<Integer>();
        for(int j = 0; j < 50; j++)
        {
            map1.add(9);
        }
        normMap.add(map1);
        fireMap.add(map1);
    }
}

public void draw(Graphics g)
{
    switch(curr_dimension)
    {
    case(0): drawTiles(g, normMap); break;
    case(1): drawTiles(g, fireMap); break;
    }

}

public void drawTiles(Graphics g, List<List<Integer>> map)
{
    for(int y = 0; y < map.size(); y++)
    {
        List<Integer> mapY = map.get(y);
        for(int x = 0; x < mapY.size(); x++)
        {
            if(mapY.get(x) == 0) g.drawImage(grassImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null);
            else if(mapY.get(x) == 1) g.drawImage(waterImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null);
            else if(mapY.get(x) == 2) g.drawImage(pathVImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null);
            else if(mapY.get(x) == 4) g.drawImage(pathHImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY, null);
            else if(mapY.get(x) == 3) g.drawImage(treeImage[curr_dimension], (x - boardX) * tileSizeX, (y - boardY) * tileSizeY - tileSizeY, null);
            else if(mapY.get(x) == 9) g.drawRect((x - boardX) * tileSizeX, (y - boardY) * tileSizeY, tileSizeX, tileSizeY);
            else if(mapY.get(x) == Board.PLAYER) GameState.player.draw(g, x, y, boardX, boardY, tileSizeX, tileSizeY);

        }
    }
}}
public int boardX=Board.boardX;
公共int boardY=Board.boardY;
public int tileSizeX=Board.tileSizeX;
public int tileSizeY=Board.tileSizeY;
public int curr\u dimension=Board.current\u dimension;
公共缓冲区映像[]grassImage={Board.norm.grassImage,Board.fire.grassImage};
public buffereImage[]waterImage={Board.norm.waterImage,Board.fire.waterImage};
公共缓冲区映像[]路径图像={Board.norm.pathVImage,Board.fire.pathVImage};
公共缓冲区映像[]路径图像={Board.norm.pathHImage,Board.fire.pathHImage};
public buffereImage[]treeImage={Board.norm.treeImage,Board.fire.treeImage};
//y/x/瓷砖类型
public List normMap=new ArrayList();
public List fireMap=new ArrayList();
@凌驾
公共无效鼠标单击(鼠标事件arg0)
{
int y=(int)Math.ceil((arg0.getY()+boardY*tileSizeY)/32);
intx=(int)Math.ceil((arg0.getX()+boardX*tileSizeX)/32);
开关(当前尺寸)
{
案例(0):normMap.get(y).set(x,0);break;
案例(1):fireMap.get(y.set(x,0);break;
}
}
@凌驾
按下公共无效键(KeyEvent arg0)
{
开关(arg0.getKeyCode())
{
case(KeyEvent.VK_ENTER):writeFile();break;
case(KeyEvent.VK_ESCAPE):GameStateManager.setState(GameStateManager.MENU_STATE);break;
案例(KeyEvent.VK_UP):boardY--;break;
case(KeyEvent.VK_DOWN):boardY++;break;
案例(KeyEvent.VK_左):boardX--;中断;
case(KeyEvent.VK_RIGHT):boardX++;break;
案例(KeyEvent.VK_1):当前维度=0;中断;
案例(KeyEvent.VK_2):当前维度=1;中断;
}
}
公共字符串getPrefix(整数维度)
{
开关(尺寸)
{
案例(0):返回“norm”;
案例(1):返回“火”;
违约:
System.out.println(“尺寸不正确,”
+维度+”。在“地图/自定义/未识别”中查找地图);
返回“身份不明”;
}
}
公共无效写入文件()
{
列表地图;
开关(当前尺寸)
{
案例(0):map=normMap;break;
案例(1):map=fireMap;break;
默认值:map=normMap;break;
}
版画作家;
尝试
{
对于(int i=0;i<2;i++)
{
writer=newprintwriter(“/maps/custom/”+getPrefix(i)+“map1.txt”、“UTF-8”);
用于(列表:地图)
{
for(整型整数:列表)
{
writer.print(整数+“”);
}
writer.println(“”);
}
writer.close();
}
}
捕获(例外e)
{
e、 printStackTrace();
}
}
@凌驾
公共void init()
{
Main.panel.addKeyListener(这个);
Main.panel.addMouseListener(本);
对于(int i=0;i<50;i++)
{
List map1=new ArrayList();
对于(int j=0;j<50;j++)
{
map1.添加(9);
}
normMap.add(map1);
fireMap.add(map1);
}
}
公共空间绘制(图g)
{
开关(当前尺寸)
{
案例(0):drawTiles(g,normMap);中断;
案例(1):图纸(g,火图);断裂;
}
}
公共空心图纸(图g,列表地图)
{
对于(int y=0;y
预期输出是两个不同的列表。但是,打印出fireMap和NormaMap会显示相同的结果


删除不重要的代码片段。如果我需要澄清什么,请告诉我

您可以在此处将同一对象添加到NormaMap和FireMap:

    normMap.add(map1);
    fireMap.add(map1);
即使两个贴图不同,贴图中的对象也是相同的。因为在两个贴图中都有相同的对象,所以normMap.get(y)和fireMap.get(y)也是相同的

normMap.get(y).set(x, 0);
您还可以更改fireMap对象。所以你的问题是,你有两个不同的贴图,但是贴图中的所有对象都是相同的

在我看来,解决问题的最简单方法是向地图中添加两个不同的对象:

for(int i = 0; i < 50; i++)
{
    List<Integer> map1 = new ArrayList<Integer>();
    List<Integer> map2 = new ArrayList<Integer>();
    for(int j = 0; j < 50; j++)
    {
        map1.add(9);
        map2.add(9);
    }
    normMap.add(map1);
    fireMap.add(map2);
}

(另外:在游戏中,平铺贴图通常是二维阵列)

请添加您遇到错误或问题时剪掉的代码。不要直接粘贴整个代码。你想在哪里打印列表值?@FallAndLearn我已经删除了所有与问题无关的代码,我是否应该进一步缩减它?@SamuelRobert这样我就可以比较它们,以检查它们是否真的相同,或者,如果这只是一个绘图问题,那么很明显,您试图在init()方法中的两个列表中添加相同的元素。你怎么能期望它会有所不同呢?
int fireMap[][] = new int[50][50];