Bartude Posted June 18, 2012 at 10:20 PM Report Share #463870 Posted June 18, 2012 at 10:20 PM Boas, eu queria ordenar uma lista ligada, só que ta a dar mal. A minha lista ligada chama-se atletas e é do tipo Atleta(uma instancia). La dentro tem os atributos ouro, prata e bronze. E queria ordenar primeiro por ouro, depois prata e depois bronze. O codigo seguinte é so o de ouro, depois é so alterar para os outros. Atleta temp; for (int i = 0; i < atletas.size() - 1; i++) { for (int j = i + 1; j < atletas.size() - 1; j++) { Atleta temp2 = atletas.get(j); if (atletas.get(i).getOuro() < atletas.get(j).getOuro()) { temp = atletas.get(i); atletas.removesem(i); atletas.add(i, atletas.get(j)); atletas.removesem(j); atletas.add(j, temp); } } } O removesem é um metodo da classe lista ligada, que quando remove, em vez de retroceder todos os elementos, deixa ali um espaço em branco, pa depois inserir. public int removesem(int index){ assert(index >= 0 && index < size()); //force valid index temp = head; //start at the beginning of the list if(index == 0){ head = null; counter--; return 0; } else if(index == size()){ tail = null; counter--; return 0; } //iterate to the position before the index for(int i = 0; i < index; i++) temp = temp.next; //set temp.next to point to the Node next to the Node to be removed temp = null; counter--; return 0; } O problema é que a partir dum certo ponto, começa a inserir tudo igual, e acaba por ficar 3/4 da lista ligada igual. Alguem sabe qual o problema? Brigado Link to comment Share on other sites More sharing options...
tiagotavares Posted June 19, 2012 at 12:00 AM Report Share #463899 Posted June 19, 2012 at 12:00 AM Boas, Não usas a variavel temp2 Tu removes a posição i e tudo passa a estar 1 index atrás e pegas no j (depois de remover é j+1). 3ª linha do if é: atletas.add(i, temp2); agora j já é j e nºao j+1 porque existe mais uma posição. O que estás a fazer neste algoritmo é trocar o valor de i com j sempre que encontras 1 menor (corrigido nos 3 pontos acima) até chegares ao fim. (Esta linha é mais um aparte. Penso que a maneira que expliquei e corrigi está correta mas posso me ter enganado. Espero ter ajudado 😉 Tiago Tavares Link to comment Share on other sites More sharing options...
Bartude Posted June 19, 2012 at 01:07 AM Author Report Share #463906 Posted June 19, 2012 at 01:07 AM Boas, isso dito assim, é um bocado confuso pa mim. Pelo que eu percebi, o codigo atao vai ficar assim: for (int i = 0; i < atletas.size() - 1; i++) { for (int j = i + 1; j < atletas.size() - 1; j++) { Atleta temp2 = atletas.get(j); if (atletas.get(i).getOuro() < atletas.get(j).getOuro()) { temp = atletas.get(i); atletas.removesem(i); j++; atletas.add(i, temp2); atletas.removesem(j); atletas.add(j, temp); } } } É assim que deveria de tar? Link to comment Share on other sites More sharing options...
tiagotavares Posted June 20, 2012 at 10:23 AM Report Share #464324 Posted June 20, 2012 at 10:23 AM (edited) Creio que será sem o j++ for (int i = 0; i < atletas.size() - 1; i++) { for (int j = i + 1; j < atletas.size() - 1; j++) { Atleta temp2 = atletas.get(j); if (atletas.get(i).getOuro() < atletas.get(j).getOuro()) { temp = atletas.get(i); atletas.removesem(i); atletas.add(i, temp2); atletas.removesem(j); atletas.add(j, temp); } } } Depois diz se funciona 😉 Edited June 20, 2012 at 10:24 AM by tiagotavares Tiago Tavares Link to comment Share on other sites More sharing options...
118 Posted June 20, 2012 at 10:59 AM Report Share #464331 Posted June 20, 2012 at 10:59 AM não seria mais indicado criares uma nova lista e ires inserindo ordenado? Ou melhor, usar um comparator que é como normalmente se faz em java Link to comment Share on other sites More sharing options...
KiNgPiTo Posted June 20, 2012 at 01:55 PM Report Share #464363 Posted June 20, 2012 at 01:55 PM É obrigatório usar LinkedList? Se usares uma TreeSet com um comparator definido por ti, terás sempre a lista ordenada... Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now