Criei o codigo que esta na imagem para percorrer uma lista duplamente encadeada e pegar o maior token(numero do No), e enviei a seguinte entrada(add no fim) : 12, 17, 14, 23, 8, 10. Deveria ser removido 23 e quando chamasse novamente o metodo removeria 17, mas esta removendo 10 e 23. O que ha de errado?Eh bug? ou erro meu?
Não da pra ter certeza da resposta pois vc não postou o código inteiro.
Assim, o ideal seria postar a codificação completa, preferencialmente escrita para copiar e rodar na IDE, pois da menos trabalho para debugar lá.
Então, posso estar errado, na construção a seguir, mas pelo menos vou tentar.
quando você declara que:
No aux = inicio; //linha 24
No maior = inicio;//linha 25
A alteração que fizer em aux será feita em maior por causa dos ponteiros e vice versa.
Ao final da execução se remover todos os números da variável maior também terá removido indiretamento os da variável auxiliar;
Isto ocorre por que os ponteiros estarão apontando para o mesmo endereço de memória, lembre a variável guarda algo e este algo tem um endereço na memória.
Então quando declara os números 12,17,14,23,8,10 e vc faz:
auxiliar.getProx() na linha 27; -> vc aponta para o 12 tanto na variável maior quanto na auxiliar
auxiliar.getProx() na linha 28; -> vc aponta para o 17 sem antes comparar o 12 em ambas as variáveis
Na linha 37 tem outro gexProx(): só que com a variável início,
em inicio.getProx() então voce acaba apontando para outro número
provavelmente a variável fim = inicio, logo o ponteiro marca o mesmo endereço de memória
assim quando você faz fim.getProx() = null, é o mesmo que fazer inicio.getProx() = null;
Ai, quando o método for reexecutado, o while não vai até o final do array obrigatóriamente,
ele vai achar o primeiro null e não vai comparar o resto.
Resumo: o código não está bugado ele fez o que você programou mas não o que você quer.
Codificação alternativa mantendo a didática proposta:
package crisis;
import java.util.ArrayList;
import java.util.Collections;
//classe principal
public class Crisis {
public static void main(String[] args) {
ArrayList<Integer> numeros = new ArrayList<>();
Collections.addAll(numeros, 12,17,14,23,8,10);
Num num = new Num(numeros);
num.ordene();
System.out.println("A variável num foi reordenada? "+!num.getNumeros().isEmpty()+"\n"+num.getNumeros());
}
}
//classe Num
package crisis;
import java.util.ArrayList;
public class Num {
private ArrayList<Integer> numeros = new ArrayList<>();
private int cont;
//a variável cont e será inicializado com 0 ao criar uma instância desta classe
Num(ArrayList<Integer> numeros) {
this.numeros = numeros;
}
//traz o próximo numero inteiro ou null quando o limite do array é atingido
Integer getNext() {
if (cont < numeros.size()) {
return numeros.get(cont++);//o incremento acontece na próxima linha
} else {
return null;
}
}
//zera o contador e retorna null ou o valor da variável numeros na posição 0
public Integer getPos0() {
cont = 0;
return numeros.isEmpty() ? null : numeros.get(0);
}
public int getCont() {
return cont;
}
public ArrayList<Integer> getNumeros() {
return numeros;
}
public void ordene() {
Num numDeSaida = new Num(new ArrayList<>());//esta instância vai guardar os números se procura
Integer aux, teste;
System.out.println("Valores a ordenar: " + this.getNumeros());
//este while tem a função de percorrer todos os valores do array
while (this.numeros.size() > 0) {
aux = this.getPos0();//atribuindo o valor na primeira posição do array à variavel aux
//este while tem a função de identificar o maior número informado
while (true) {
if ((teste = this.getNext()) != null) {
aux = aux > teste ? aux : teste;
}
if (this.getCont() == this.numeros.size()) {
break;
}
}
numDeSaida.getNumeros().add(aux);//adicionando o maior número em outra variável do tipo Num
this.getNumeros().remove(aux);//é melhor remover o objeto do que o declarar como null pois da menos trabalho pra comparar
}
System.out.println("Valores ordenados: " + numDeSaida.getNumeros()
+ "\nA variável num está sem \"números\"? -> | " + this.getNumeros().isEmpty() + " | \nFim da Codificação");
this.numeros = numDeSaida.getNumeros();//se não for assim this fica com o array vazio
}
}
Obrigado pelas respostas, mas encontrei o erro: o problema era que eu estava comparando sempre o i e o i + 1 e fazendoa variavel maior receber o valor dessa comparação. Sendo que o certo era fazer maior = i, depois comparar maior com i, i + 1, i + n, ou seja,
if(maior.getToken < aux.getProx().getToken()) {
maior = aux.getProx();
}
aux = aux.getProx();