boa noite
gostaria de saber por favor como faço para realizar a troca de 2 elementos criados dinamicamente de estrutura…
public void trocarElementos(Object m, Object n) {
Celula elemento1 = procurarElemento(m);
Celula elemento2 = procurarElemento(n);
if ((elemento1 == null) || (elemento2 == null)) {
throw new IllegalArgumentException("Os valores informados não contêm no arranjo");
}
Celula aux = 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.
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. )
fiz a lista ligada sem usar a api java
package listaDinamica;
public class ListaDinamica {
private Celula primeiro, ultimo;
public ListaDinamica() {
primeiro = new Celula();
ultimo = primeiro;
primeiro.setProx(null);
}
public void inserirPrimeiroElemento(Object elementoNovo) {
Celula primeiroElemento = primeiro;
Celula novoElemento = new Celula();
novoElemento.setElemento(elementoNovo);
novoElemento.setProx(null);
primeiroElemento.setProx(novoElemento);
ultimo = novoElemento;
}
public void inserirEntreElemento(Object elementoNovo,
Celula elementoAnterior) {
Celula novoElemento = new Celula();
novoElemento.setElemento(elementoNovo);
novoElemento.setProx(elementoAnterior.getProx());
elementoAnterior.setProx(novoElemento);
}
public void inserirUltimoElemento(Object elementoNovo) {
Celula novoElemento = new Celula();
novoElemento.setElemento(elementoNovo);
novoElemento.setProx(null);
ultimo.setProx(novoElemento);
ultimo = novoElemento;
}
public Celula procurarElemento(Object elementoProcurado) {
Celula atual = primeiro.getProx();
while (atual != null) {
if (atual.getElemento().equals(elementoProcurado)) {
return atual;
}
atual = atual.getProx();
}
throw new IllegalArgumentException("Celula não encontrada");
}
public Celula procurarElementoAnterior(Object elementoProcurado) {
Celula atual = procurarElemento(elementoProcurado);
Celula anterior = primeiro;
while (atual != null) {
if (atual.getElemento().equals(anterior.getProx())) {
return atual;
}
}
throw new IllegalArgumentException("Celula anterior não encontrada");
}
public void trocarElementos(Object m, Object n) {
Celula elemento1 = procurarElemento(m);
Celula elemento2 = procurarElemento(n);
if ((elemento1 == null) || (elemento2 == null)) {
throw new IllegalArgumentException("Os valores informados não contêm no arranjo");
}
Celula aux = elemento1;
elemento1 = elemento2;
elemento2 = aux;
}
public void mostrarLista() {
Celula atual = primeiro.getProx();
while (atual != null) {
System.out.println(atual.getElemento());
atual = atual.getProx();
}
}
public boolean listaVazia() {
return primeiro == ultimo;
}
public int tamanhoLista() {
int contador = 0;
Celula atual = primeiro.getProx();
while (atual != null) {
contador++;
atual = atual.getProx();
}
return contador;
}
}
foi assim q fiz meu codigo tem a classe celula
package listaDinamica;
public class Celula {
private Object elemento;
private Celula prox;
public Object getElemento() {
return elemento;
}
public void setElemento(Object elemento) {
this.elemento = elemento;
}
public Celula getProx() {
return prox;
}
public void setProx(Celula prox) {
this.prox = prox;
}
}
Ache as 2 células (como você fez) e use getElemento() e setElemento() corretamente.
Algo como:
Celula celula1 = ...;
Celula celula2 = ...;
Object o1 = celula1.getElemento();
Object o2 = celula2.getElemento();
celula1.setElemento (o2);
celula2.setElemento (o1);
Acho que você deve ter entendido a idéia.
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?
entanglement:
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?
kkkkkk, cara esse é o proposito do exercício…
utilizar lista simplesmente encadeada
[quote=entanglement]Ache as 2 células (como você fez) e use getElemento() e setElemento() corretamente.
Algo como:
Celula celula1 = ...;
Celula celula2 = ...;
Object o1 = celula1.getElemento();
Object o2 = celula2.getElemento();
celula1.setElemento (o2);
celula2.setElemento (o1);
Acho que você deve ter entendido a idéia. [/quote]
estou passando a referencia diretamente ao objeto…
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.
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:
object o1 = new string("bla");
object o2 = new string("ble");
swap (ref o1, ref o2);
...
Console.WriteLine (o1); // imprimir "ble"
Console.WriteLine (o2); // imprimir "bla"
Esse método “swap” não pode ser escrito em Java.
[quote=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:
object o1 = new string("bla");
object o2 = new string("ble");
swap (ref o1, ref o2);
...
Console.WriteLine (o1); // imprimir "ble"
Console.WriteLine (o2); // imprimir "bla"
Esse método “swap” não pode ser escrito em Java. [/quote]
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.
não entendi muito bem o que vc disse…
entanglement:
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.
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
public void trocarElementos(Object m, Object n) {
Celula elemento1 = procurarElemento(m);
Celula elemento2 = procurarElemento(n);
if ((elemento1 == null) || (elemento2 == null)) {
throw new IllegalArgumentException("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
pessoal, obrigado pela ajuda, o codigo certo é esse…
vlw…
serve para lista dinâmica simples…
public void trocarElementos(Object m, Object n) {
Celula celula1 = procurarCelula(m);
Celula celula2 = procurarCelula(n);
Celula celulaAnterior1 = procurarCelulaAnterior(celula1);
Celula celulaAnterior2 = procurarCelulaAnterior(celula2);
if ((celulaAnterior1 == null) || (celulaAnterior2 == null)
|| (celulaAnterior1.equals(celulaAnterior2))) {
throw new IllegalArgumentException(
"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);
}
1 curtida