1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Java - Referências and stuff

Discussão em 'Programação' iniciada por Cfreitas, 6 de Março de 2013. (Respostas: 2; Visualizações: 536)

  1. Cfreitas

    Cfreitas Power Member

    Boas pessoal,

    Estou com um problema com o Java.
    Entao:

    Tenho uma classe que tem um array bidimenssional [3][3] como uma das propriedades chamado board.
    Depois criei uma função nessa classe que pega na board do objecto e cria um novo objecto com a board alterada.

    Código:
    int a[][]=Origem.getBoard(); ->retorna a board do objecto origem.                a[y][x]=a[y][x-1];
                    a[y][x-1]=0;
                    Node auxiliar=new Node(a,Origem,"MOVE_LEFT",Origem.getPath_cost()+1,Origem.getDepth()+1); //cria um novo nó com o resultado da aplicação da movimentação aplicada ao antigo e retorna-o
                    auxiliar.printBoard();
                    System.out.println();
                    return auxiliar;
    
    Agora o problema:
    Quando aplico esta função o no que retorna fica como deve ser mas o original também é alterado.
    Já pesquisei N sobre este assunto.
    Se alguém me pudesse explicar o que se passa aqui agradecia.

    cumps
     
  2. Ryu^

    Ryu^ Power Member

    Código:
    [B][COLOR=#ff0000]int a[][]=Origem.getBoard()[/COLOR];[/B] ->retorna a board do objecto origem.                a[y][x]=a[y][x-1];
                    a[y][x-1]=0;
                    Node auxiliar=new Node([COLOR=#ff0000][B]a,Origem[/B][/COLOR],"MOVE_LEFT",Origem.getPath_cost()+1,Origem.getDepth()+1); //cria um novo nó com o resultado da aplicação da movimentação aplicada ao antigo e retorna-o
                    auxiliar.printBoard();
                    System.out.println();
                    return auxiliar;
    
    O que me parece é que as variáveis "a" e "Origem" têm a mesma referência, logo ao fazeres a[y][x]=a[y][x-1]; e a[y][x-1]=0; estás a alterar ambas. Se por acaso este código era para estar comentado e a função Node() é que altera, antes de alterar deves criar uma nova instância com uma função do tipo:
    Código:
    public int[][] copiaBoard(int[][] boardACopiar){
         int x = boardACopiar.length;
         int y = boardACopiar[0].length;
         int[][] boardAAlterar = new int[x][y];
         for(int i=0; i<x; i++){
              for(int j=0; j<y; j++){
                   boardAAlterar[i][j]=boardACopiar[i][j];
             }
         }
         return boardAAlterar;
    }
    
    Este código não foi testado e assume que o tamanho do array é igual em todas as posições.
     
    Última edição: 6 de Março de 2013
  3. Cfreitas

    Cfreitas Power Member

    Funciona.
    Pelo o que eu li o Java só faz isso para os arrays.
    Alguém confirma essa info?

    Cumps e MUITO obrigado!
     

Partilhar esta Página