Pessoal, estou com uma dúvida…
Tenho essas duas classes e queria saber como ordenar as arrayslists da classe ranking em ordem crescente de acordo com a pontuação do jogador.
Agradeço se puderem ajudar!
package jogodamemoria;
import java.util.Comparator;
import java.util.ArrayList;
import java.util.LinkedList;
public class Ranking {
private ArrayList<Jogador> lvFacil = new ArrayList<>();
private ArrayList<Jogador> lvMedio = new ArrayList<>();
private ArrayList<Jogador> lvDificl = new ArrayList<>();
public void ranking(int n, Jogador j) {
if (n == 2) {
lvFacil.add(j);
//Collections.sort(lvFacil);
for (Jogador lvF : lvFacil) {
System.out.println("Nome: " + lvF.getNome() + " Pontuacao: " + lvF.getPontuacao());
}
} else if (n == 6) {
lvMedio.add(j);
//Collections.sort(lvMedio);
for (Jogador lvM : lvMedio) {
System.out.println("Nome: " + lvM.getNome() + " Pontuacao: " + lvM.getPontuacao());
}
} else {
lvDificl.add(j);
// Collections.sort(lvDificl);
for (Jogador lvD : lvDificl) {
System.out.println("Nome: " + lvD.getNome() + " Pontuacao: " + lvD.getPontuacao());
}
}
}
package jogodamemoria;
public class Jogador {
private String nome;
private int jogadas = 0;
public Jogador(String n) {
this.nome = n;
}
public String getNome() {
return this.nome;
}
public int getPontuacao() {
return this.jogadas;
}
public void TotalDeJogadas() {
this.jogadas++;
}
}
List<Jogador> listaOrdenada = new ArrayList();
listaOrdenada.addAll(lvFacil);
listaOrdenada.addAll(lvMedio);
listaOrdenada.addAll(lvDificil);
// Aqui a lista ainda está desordenada
Collections.sort(listaOrdenada, new Comparator<Jogador>() {
@Override
public int compare(Jogador o1, Jogador o2) {
return Integer.valueOf(o1.getPontuacao()).compareTo(Integer.valueOf(o2.getPontuacao));
}
});
// Aqui a lista ja estará ordenada
Entender eu entendi mas não consegui implementar. Já tinha visto um monte de exemplo e também dei uma olhada numa apostila da Caelum que tenho mas não consegui.
Esse código aí deve ficar na classe ranking mesmo?
Sim, eu preciso ordenar cada array separadamente. Com esse código aí ele faz isso?
Esse código, do jeito que está escrito, deve ficar na sua classe Ranking. Você pode melhorá-lo implementando-o em uma classe que implemente a interface Comparator e sobreescreva o método compare com código acima dentro da sua nova classe, ficando assim:
public class MeuComparator implements Comparator<Jogador> {
@Override
public int compare(Jogador j1, Jogador j2) {
return Integer.valueOf(j1.getPontuacao()).compareTo(Integer.valueOf(j2.getPontuacao()));
}
}
Para ordenar separadamente cada ArrayList, você deve ignorar o código que eu coloquei acima, pois ele concatena as 3 listas em uma só. Você deve apenas substituir os comentários do seu código pela chamada do método sort da classe Collections passando como parâmetro um novo objeto da nova classe MeuComparator implementada acima, ficando assim:
//Collections.sort(lvFacil); substituir por Collections.sort(lvFacil, new MeuComparator());
//Collections.sort(lvMedio); substituir por Collections.sort(lvMedio, new MeuComparator());
//Collections.sort(lvDificl); substituir por Collections.sort(lvDificl, new MeuComparator());