gostaria de saber por favor como faço para realizar a troca de 2 elementos criados dinamicamente de estrutura…
publicvoidtrocarElementos(Objectm,Objectn){Celulaelemento1=procurarElemento(m);Celulaelemento2=procurarElemento(n);if((elemento1==null)||(elemento2==null)){thrownewIllegalArgumentException("Os valores informados não contêm no arranjo");}Celulaaux=elemento1;elemento1=elemento2;elemento2=aux;}
cheguei a efetuar esse código mas acredito que eu esteja errado pelo fato de estar passando a referencia de um objeto de forma errada…
como eu poderia refazer este código ou alguém poderia me indicar algo para ler, para efetuar a trocar entre 2 objetos em uma lista encadeada simples…
Para trocar 2 elementos em uma lista encadeada, você precisa mexer diretamente na estrutura que representa a lista.
Esse código que você mostrou não faz isso, nem tem como fazer isso.
E
entanglement
Você tem o código da sua lista encadeada? (Obviamente isso é lição de casa, já que existe uma classe java.util.LinkedList<> que é uma lista encadeada. )
M
macario1983
fiz a lista ligada sem usar a api java
packagelistaDinamica;publicclassListaDinamica{privateCelulaprimeiro,ultimo;publicListaDinamica(){primeiro=newCelula();ultimo=primeiro;primeiro.setProx(null);}publicvoidinserirPrimeiroElemento(ObjectelementoNovo){CelulaprimeiroElemento=primeiro;CelulanovoElemento=newCelula();novoElemento.setElemento(elementoNovo);novoElemento.setProx(null);primeiroElemento.setProx(novoElemento);ultimo=novoElemento;}publicvoidinserirEntreElemento(ObjectelementoNovo,CelulaelementoAnterior){CelulanovoElemento=newCelula();novoElemento.setElemento(elementoNovo);novoElemento.setProx(elementoAnterior.getProx());elementoAnterior.setProx(novoElemento);}publicvoidinserirUltimoElemento(ObjectelementoNovo){CelulanovoElemento=newCelula();novoElemento.setElemento(elementoNovo);novoElemento.setProx(null);ultimo.setProx(novoElemento);ultimo=novoElemento;}publicCelulaprocurarElemento(ObjectelementoProcurado){Celulaatual=primeiro.getProx();while(atual!=null){if(atual.getElemento().equals(elementoProcurado)){returnatual;}atual=atual.getProx();}thrownewIllegalArgumentException("Celula não encontrada");}publicCelulaprocurarElementoAnterior(ObjectelementoProcurado){Celulaatual=procurarElemento(elementoProcurado);Celulaanterior=primeiro;while(atual!=null){if(atual.getElemento().equals(anterior.getProx())){returnatual;}}thrownewIllegalArgumentException("Celula anterior não encontrada");}publicvoidtrocarElementos(Objectm,Objectn){Celulaelemento1=procurarElemento(m);Celulaelemento2=procurarElemento(n);if((elemento1==null)||(elemento2==null)){thrownewIllegalArgumentException("Os valores informados não contêm no arranjo");}Celulaaux=elemento1;elemento1=elemento2;elemento2=aux;}publicvoidmostrarLista(){Celulaatual=primeiro.getProx();while(atual!=null){System.out.println(atual.getElemento());atual=atual.getProx();}}publicbooleanlistaVazia(){returnprimeiro==ultimo;}publicinttamanhoLista(){intcontador=0;Celulaatual=primeiro.getProx();while(atual!=null){contador++;atual=atual.getProx();}returncontador;}}
A propósito, você deve ter visto que andar sobre uma lista simplesmente ligada (que é o que você fez) é horrível, porque para pegar o elemento anterior você tem de percorrer a lista inteira e voltar um para trás. Que tal ter uma lista duplamente ligada?
M
macario1983
kkkkkk, cara esse é o proposito do exercício…
utilizar lista simplesmente encadeada
M
macario1983
entanglement:
Ache as 2 células (como você fez) e use getElemento() e setElemento() corretamente.
estou passando a referencia diretamente ao objeto…
E
entanglement
Eu pus os “…” para ver se você pensa um pouco e completa com o que é necessário. Você na verdade até já fez isso antes no código que você me mostrou, mas quero que você é que imagine o que vai naqueles “…”.
Outra forma, que o pessoal também pode usar, é mexer mais profundamente na lista ligada, e trabalhar com o campo “prox” de cada célula. Obviamente, nesse caso você precisa fazer um desenho e ver que tipos de mudanças você precisa fazer.
E
entanglement
Não se esqueça: em Java, não é possível passar uma referência para um objeto “por referência”. Java não é C#, em C# você poderia criar um método assim:
Não se esqueça: em Java, não é possível passar uma referência para um objeto “por referência”. Java não é C#, em C# você poderia criar um método assim:
eu sei, eu vi numas páginas, acho que é uma boa hora pra aprender melhor sobre esse assunto de trabalhar com referencia a objeto em Java.
M
macario1983
não entendi muito bem o que vc disse…
realmente cheguei a pensar em fazer deste modo sabe, mas tipo tenho que fazer uma logica para pensar se esta em primeiro, ultimo coisas do tipo…
na hora de debugar o hashcode que aparece no Eclipse é um end de memoria?
Tem como ver?
Vlw
M
macario1983
publicvoidtrocarElementos(Objectm,Objectn){Celulaelemento1=procurarElemento(m);Celulaelemento2=procurarElemento(n);if((elemento1==null)||(elemento2==null)){thrownewIllegalArgumentException("Os valores informados não contêm no arranjo");}m=elemento1.getElemento();n=elemento2.getElemento();elemento1.setElemento(n);elemento2.setElemento(m);}
eu fiz este código aqui e deu certo agora…
mas preciso estudar essa coisa de referencia de memoria em Java
porque eu vi uma coisa em um blog aonde o cara mostrava a diferença entre a passagem via parâmetro de método e recebendo dentro de uma variavel criada dentro do metodo…
vou verificar…
pois um colega ainda disse estar errado
M
macario19831 like
pessoal, obrigado pela ajuda, o codigo certo é esse…
vlw…
serve para lista dinâmica simples…
publicvoidtrocarElementos(Objectm,Objectn){Celulacelula1=procurarCelula(m);Celulacelula2=procurarCelula(n);CelulacelulaAnterior1=procurarCelulaAnterior(celula1);CelulacelulaAnterior2=procurarCelulaAnterior(celula2);if((celulaAnterior1==null)||(celulaAnterior2==null)||(celulaAnterior1.equals(celulaAnterior2))){thrownewIllegalArgumentException("Os valores informados não contêm no arranjo");}celulaAnterior1.setProx(celula2);celulaAnterior2.setProx(celula1);celulaAnterior1=celula1.getProx();celulaAnterior2=celula2.getProx();celula1.setProx(celulaAnterior2);celula2.setProx(celulaAnterior1);}