Modificando valores em uma LinkedList

8 respostas
F

Tenho uma duvida…
tenho o seguinte metodo na classe abstrata SerVivo:

protected LinkedList posicoesVazias = new LinkedList();
    public void verificaVizinhos(Grade grade, int[] posicao){
        int[] pos = new int[2];
        pos[0] = posicao[0]+1;
        pos[1] = posicao[1];
        if (pos[0] < grade.getDimensaoXTamanho() -1){
            classificaSerVivo(grade, pos);
            pos[1] = posicao[1] + 1;
            if (pos[1] < grade.getDimensaoYTamanho() - 1){
                classificaSerVivo(grade, pos);
            }
        }

O metodo classificaSerVivo está numa classe derivada Couve

public void classificaSerVivo(Grade grade, int[] posicao){
        if (grade.getSerVivoPosicao(posicao) == null){
            posicoesVazias.add(posicao);
        } else if (grade.getSerVivoPosicao(posicao) instanceof Couve){
            numCouvesVizinhas++;
        } else if (grade.getSerVivoPosicao(posicao) instanceof Couve){
            numOvelhasVizinhas++;
        }
    }

O problema é que por exemplo, na primera chamada do met. ‘classificaSerVivo()’ adiciona o valor (0,1). Cada vez que mudo os valores de pos[] ou posicao[] no met. ‘verificaVizinhos()’, modifica todos os valores da lista, por exemplo, adiciona um novo valor, por exemplo (1,1), dai ele altera todos os valores da lista pra (1,1) tambem. Acho que o problema deve ser um apontando para o outro, gostaria de saber como que eu faço para os valores dentro da lista nao serem modificados? Obrigado

[size=“11”][color=“red”]* Editado: Lembre-se de utilizar BBCode em seus códigos - Matheus [/color][/size] :joia:

8 Respostas

N

Olá, irmão!

Você viu que há um erro no trecho de código a seguir?

public void classificaSerVivo(Grade grade, int[] posicao){ if (grade.getSerVivoPosicao(posicao) == null){ posicoesVazias.add(posicao); } else if (grade.getSerVivoPosicao(posicao) instanceof Couve){ numCouvesVizinhas++; } else if (grade.getSerVivoPosicao(posicao) instanceof Couve){ numOvelhasVizinhas++; } }

O último “else if” nunca é alcançado, pois os 2 são iguais. Esse else if deve ser
else if (grade.getSerVivoPosicao(posicao) instanceof Ovelhas)

Se estiver tendo dificuldades com passagens por parâmetro ou por referência, dê uma olhada nesse artigo:

Paz!

C

boa tarde pessoal blza?
aproveitando que o assunto é refência, e utilizando o exmplo contido no link passado acima, me ajudem a entender:

public void tricky(Point arg1, Point arg2)
{
  arg1.x = 100;
  arg1.y = 100;

  Point temp = arg1;
  arg1 = arg2;
  arg2 = temp;
}

public static void main(String [] args)
{
  Point pnt1 = new Point(0,0);
  Point pnt2 = new Point(0,0);
  System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
  System.out.println(" ");
  tricky(pnt1,pnt2);
  System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);  
}

o metodo tricky recebe como argumento dois objetos point certo?
que são instânciados dentro de main.
o que eu não estou entendendo muito bem é o que acontece dentro do tricky(), arg1 e arg2 se tornão cópias ou referências de pnt1 e pnt2?
porque pnt1 apresenta seus valores alterados e pnt2 não?
posso criar referências de referências???

eu li e reli o artigo mas eu não peguei a idéia completa da coisa!!! :lol:

agradeço desde já qualquer esclarecimento
muito obrigado :cool: :grin: :cool:

[size=“11”][color=“red”]* Editado: Lembre-se de utilizar BBCode em seus códigos - Matheus [/color][/size] :joia:

C

alguem??? :cry: :cry:

N
"C3pO":
boa tarde pessoal blza? aproveitando que o assunto é refência, e utilizando o exmplo contido no link passado acima, me ajudem a entender:
public void tricky(Point arg1, Point arg2)
{
  arg1.x = 100;
  arg1.y = 100;

  Point temp = arg1;
  arg1 = arg2;
  arg2 = temp;
}

public static void main(String [] args)
{
  Point pnt1 = new Point(0,0);
  Point pnt2 = new Point(0,0);
  System.out.println("X: " + pnt1.x + " Y: " +pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);
  System.out.println(" ");
  tricky(pnt1,pnt2);
  System.out.println("X: " + pnt1.x + " Y:" + pnt1.y); 
  System.out.println("X: " + pnt2.x + " Y: " +pnt2.y);  
}

o metodo tricky recebe como argumento dois objetos point certo?
que são instânciados dentro de main.
o que eu não estou entendendo muito bem é o que acontece dentro do tricky(), arg1 e arg2 se tornão cópias ou referências de pnt1 e pnt2?
porque pnt1 apresenta seus valores alterados e pnt2 não?
posso criar referências de referências?????

eu li e reli o artigo mas eu não peguei a idéia completa da coisa!!!!!!! :lol:

agradeço desde já qualquer esclarecimento
muito obrigado :cool: :grin: :cool:

[size="11"][color="red"]* Editado: Lembre-se de utilizar BBCode em seus códigos - Matheus [/color][/size] :joia:

Beleza, irmão?

O negócio é o seguinte, essa é uma maneira do java simular uma passagem por referência (se você programa em C sabe do que estou falando). Lembra-se das figuras do artigo? Duas referências apontando para o mesmo objeto, certo? Quando você altera um atributo de uma classe (o objeto), todas as referências que apontam para esse objeto enxergarão essa mudança no objeto.

[img]http://www.javaworld.com/javaworld/javaqa/2000-05/images/03-qa-0512-pass1.gif[/img]
Nessa figura duas referências para o mesmo objeto.

[img]http://www.javaworld.com/javaworld/javaqa/2000-05/images/03-qa-0512-pass2b.gif[/img]
Aqui os atributos foram alterados, as duas referências enxergam essa alteração.

No caso, o outro objeto não se alterou porque foi criada uma referência para outro objeto, entendeu? Ficou meio confuso, mas basicamente é isso aí!

Veja o trecho de código:

public void tricky(Point arg1, Point arg2)
{
  arg1.x = 100; // arg1 alterou um atributo do objeto
  arg1.y = 100;

  Point temp = arg1;
  arg1 = arg2;
  arg2 = temp; // arg2 recebeu uma outra referência.
}

Fique na paz!

C

fala ae amigo, blza? :grin:

da uma olhada, e me corrija se estiver errado, la vai:

-foram criados duas intancias da classe Point (pnt1 e pnt2)
-essas, são passadas como argumento para o metodo tricky()
-o metodo cria dois objetos que srvirão como referência para os obj.pnt1 e pnt2 (arg1 e arg2)
-arg1 >>>>> aponta para pnt1
-arg2 >>>>> aponta para pnt2
-quando altero um dos atributos de arg1 (como no exemplo), essa alteração é refletida pelo objeto ao qual ele faz referência (pnt2)
-arg2 não foi alterado portanto pnt2 mantem seus valores como 0
-arg2 = temp , arg2 faz referência a outro objeto, portanto ele imprime seus atributos como 0

seria algo mais ou menos isso??? 8O 8O 8O

não consigo enetender porque arg1=arg2 não altera os atributos de arg1 e consequentemente de pnt1

desculpem tantas perguntas mas eu sou cabeça dura, heheheheh :lol:

desde já agradeço pela ajuda

C

alguem ae??? :cry: :cry:
por favor
não quero passar o final de semana com duvidas, hehehe :lol:

N

Sim, você está correto. Só corrija o seguinte trecho

Veja o código

Point temp = arg1;

temp aponta para o mesmo objeto que arg1, ok?

arg1 = arg2;

arg1 já não aponta mais para pnt1, mas as alterações já foram feitas em pnt1! Depois disso, arg1 aponta para pnt2.

Finalmente,

arg2 = temp;

arg2 agora possui o antigo valor de [b]arg1 /b, no entanto, isso aqui não faz efeito algum, pois assim que o método terminar, as referências arg2 e temp não existirão mais, e estarão sujeitas ao garbage collection! Ficou claro agora?

Pessoal, me corrijam se eu falei besteira!

Bom, mais perguntas somente na segunda-feira! :grin:
Paz!

C

valeu amigo, esta resposta me ajudou muito
valeuuuuuuuuuuuuuuuu :grin: :grin: :grin: :cool:

até a próxima!!!

Criado 22 de junho de 2005
Ultima resposta 24 de jun. de 2005
Respostas 8
Participantes 3