即使未更改,Array List值也会更改

时间:2015-01-27 07:18:35

标签: java arrays list arraylist linked-list

在方法updateMasterGrid()中, 1,我正在显示c.getBall的值。来源是quadCellGrid arraylist

第二我将quadCellGrid中的值赋给mastergrid

3我正在显示c.getBall.Source是quadCellGrid arraylist

将quadCellGrid中的值赋给mastergrid后。我可以看到quadCellGrid中值的变化。请检查logcat输出。

能告诉我如何解决这个问题。

public class BurstBalls { 

private boolean Q1Match,Q2Match,Q3Match,Q4Match;

private Texture RED_BALL;
private Texture BURST_STAR; 
private List<CellGrid> masterGrid;
private List<CellGrid> quadCellGrid  = new ArrayList<CellGrid>();  
private List<CellGrid> burstCellGrid = new ArrayList<CellGrid>();  
private SpriteBatch batch; 

private float scaleXY = 0.1f;

private int Q1Moves[][] = { { 0, 0 },{ -1, 0 }, { 0, 1 }, { -1, 1 } }; 
private int Q2Moves[][] = { { 0, 0 },{  1, 0 }, { 0, 1 }, {  1, 1 } }; 
private int Q3Moves[][] = { { 0, 0 },{  1, 0 }, { 0,-1 }, {  1,-1 } }; 
private int Q4Moves[][] = { { 0, 0 },{ -1, 0 }, { 0,-1 }, { -1,-1 } };  

public BurstBalls( ) {  
    setGameTextures();
}


public void draw(SpriteBatch sb){    
    batch=sb;  
    if(!burstCellGrid.isEmpty()){ 
        showImageZoom1(BURST_STAR, burstCellGrid.get(0).getColCoordinate()/2, burstCellGrid.get(0).getRowCoordinate()/2); 
    }
}

private void showImageZoom1(Texture t, int x, int y) {
    scaleXY = scaleXY + 0.05f;
    if (scaleXY >= 1.0){
        //burstCellGrid.clear();
        scaleXY = 1.0f;
    }
    Sprite s = new Sprite(t);
    s.setPosition(x, y);
    s.setScale(scaleXY);
    s.draw(batch);
}

public List<CellGrid> getMatchBallCells(int row, int col, Ball b, List<CellGrid> mGrid){  
    this.masterGrid=mGrid;
    Q1Match=false;
    Q2Match=false;
    Q3Match=false;
    Q4Match=false;

    quadCellGrid.clear();
    burstCellGrid.clear();

    if(row<(MainGame.ROW-1) && col >0){
        Q1Match = checkCells(b, row,col, Q1Moves);  
        System.out.println("Q1Match : " + Q1Match);
    }

    if(row<(MainGame.ROW-1) && col < (MainGame.COL-1)){ 
        Q2Match = checkCells(b,row,col, Q2Moves);   
        System.out.println("Q2Match : " + Q2Match);
    }

    if(row>0 && col< (MainGame.COL-1)){ 
        Q3Match = checkCells(b, row,col, Q3Moves);  
        System.out.println("Q3Match : " + Q3Match);
    }

    if(row>0 && col > 0){ 
        Q4Match = checkCells(b, row,col, Q4Moves);  
        System.out.println("Q4Match : " + Q4Match);
    }   
    if(Q1Match || Q2Match || Q3Match || Q4Match){ 
        updateMasterGrid();
    } 

    for (CellGrid c : burstCellGrid) {
        if(c.getBall()!=null){
            System.out.println("!Burst Cells - (c.getRow(),c.getCol) - " + "(" + c.getRow() +","+c.getCol() +")"); 
        }
    } 

    return masterGrid; 
}

private void updateMasterGrid() {
    for(CellGrid c: quadCellGrid){   
        System.out.println(" Before quadCellGrid.ball " +  c.getBall());   
        masterGrid.get(masterGrid.indexOf(c)).setBall(null); 
        System.out.println(" After  quadCellGrid.ball " +  c.getBall());   
    }  
}  

private boolean checkCells(Ball actionBall,int row,int col,int moves[][]) {  
    boolean firstCell = false,secondCell = false,thirdCell = false,fourthCell = false;
    CellGrid cellGrid=checkIfBallThere(row+moves[0][1],col+moves[0][0]);
    firstCell = checkBall(cellGrid,actionBall); 

    cellGrid=checkIfBallThere(row+moves[1][1],col+moves[1][0]);
    secondCell = checkBall(cellGrid,actionBall); 

    cellGrid=checkIfBallThere(row+moves[2][1],col+moves[2][0]);
    thirdCell = checkBall(cellGrid,actionBall); 

    cellGrid=checkIfBallThere(row+moves[3][1],col+moves[3][0]);
    fourthCell = checkBall(cellGrid,actionBall); 

    if(firstCell && secondCell && thirdCell && fourthCell){  
        return true;  
    } 
    return false;  
}

private boolean checkBall(CellGrid c, Ball actionBall) { 
    if(c!=null && c.getBall().getTexture().equals(actionBall.getTexture())){ 
        if (!quadCellGrid.contains(c)){ 
            quadCellGrid.add(c); 
        }
        return true;
    } 
    return false;
}  

public CellGrid checkIfBallThere(int cellRow, int cellCol ) {
    for (CellGrid c : masterGrid) {
        if (c.getRow() == cellRow && c.getCol() == cellCol
                && c.getBall() != null) {  
            return c;
        }
    }
    return null;
} 

private void setGameTextures() {
    RED_BALL = Texturemanager.RED_BALL;
    RED_BALL.setFilter(TextureFilter.Linear, TextureFilter.Linear);

    BURST_STAR = Texturemanager.BURST_STAR; 
    BURST_STAR.setFilter(TextureFilter.Linear, TextureFilter.Linear); 
}

}

logcat的

Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41414ed8
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41415670
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@414155e0
After  quadCellGrid.ball null
Before quadCellGrid.ball com.puzzle.game.ballpool.Ball@41415628
After  quadCellGrid.ball null

2 个答案:

答案 0 :(得分:0)

我不知道你是如何填充mastergrid和quadcellgrid的,但这条线对我来说似乎是罪魁祸首。

masterGrid.get(masterGrid.indexOf(c)).setBall(null); 

您可能在MastCellGrid和Quadcellgrid中都存储了相同的Cellgrid对象实例,因此在首先打印它时,将其设为null,然后再次打印它,打印为null。

检查或发布你的种群逻辑。

答案 1 :(得分:0)

列表是引用的列表。如果从一个列表中获取引用并将其添加到另一个列表,则两个列表都引用了相同的对象

如果您获得对此类对象的引用并对其进行变更(设置字段),则更改将反映在两个列表的相关元素中。