Ajuda com Ranking

Oi galera! Tudo Bem!
É a minha primeira vez no fórum! Estou até emocionada! :choroo:

Falando sério, eu gostaria de saber como eu posso fazer um Ranking.

o que eu fiz não deu certo. Se por exemplo, uma pessoa que tivesse 20 pontos em um jogo e estivesse em terceiro lugar, perdesse esse lugar pra uma que fizesse 21, o novo colocado seria colocado em terceiro lugar, mas o que estava em terceiro, seria apagado da lista em vez de passar pro quarto lugar.

Alguém poderia me dar uma dica?

Desde já, obrigada. :grin:

  1. Pegue uma coleção.

  2. Adicione o novo elemento (seu jogador).

  3. Ordene a coleção

  4. Se o novo tamanho da coleção for maior que o tamanho máximo desejado (no seu caso, 3), remova o último elemento.

Obrigada pela dica, mas como eu faço pra passar o nome e os pontos de um lugar para outros, sem perder a informação anterior?
Ex:
1.º - João 12
2.º - Maria 10
3.º - Paulo 8

Juca joga e faz 15 pontos:
1.º - Juca 15
2.º - João 12
3.º - Maria 10

e Paulo é removido.

Quando eu tento fazer isso, O João é removido, o Juca vai pro lugar dele e a Maria e o Paulo continuam no mesmo lugar.

Vocês poderiam me dar um exemplo de como solucionar esse problema?

Resolvi fazer o código, pois existem muitos detalhes que seriam demorados para explicar. Aquilo que não entender, busque na literatura.

import java.util.Comparator;
import java.util.TreeSet;

/**
 * @Author Vinci Amorim
 * 16/06/2005
 */

public class Raking {
    private static final TreeSet ranking = new TreeSet(new PessoaComparator());
    private static final int RANK_MAX = 3;

    private static void rankear(Pessoa p) {
        // Adicionar pessoa a colecao
        ranking.add(p);

        if(ranking.size() > RANK_MAX)
        ranking.remove(ranking.last());
    }



    public static void main(String[] args) {

        rankear(new Pessoa(1, "A"));
        rankear(new Pessoa(2, "B"));
        rankear(new Pessoa(3, "C"));
        rankear(new Pessoa(4, "D"));
        rankear(new Pessoa(3, "E"));
        rankear(new Pessoa(2, "F"));
        rankear(new Pessoa(1, "G"));

        System.out.println(ranking);
    }


}

class Pessoa {
    private final int pontuacao;
    private final String nome;

    public String getNome() {
        return nome;
    }

    public int getPontuacao() {
        return pontuacao;
    }

    public Pessoa(int pontuacao, String nome) {
        this.pontuacao = pontuacao;
        this.nome = nome;
    }

    public boolean equals(Object o) {
        if (o instanceof Pessoa) {
            Pessoa aPessoa = (Pessoa) o;
            return aPessoa.nome.equals(nome);
        }

        return false;
    }

    public int hashCode() {
        return nome.hashCode();
    }

    public String toString() {
        return  nome + " (" + pontuacao + ") ";
    }
}

class PessoaComparator implements Comparator{

    public int compare(Object o1, Object o2) {
        Pessoa p1 = (Pessoa) o1;
        Pessoa p2 = (Pessoa) o2;

        return p2.getPontuacao() - p1.getPontuacao();
    }
}

A saída deve ser [quote][D (4) , C (3) , B (2) ][/quote]

Espero que isso não seja um trabalhinho da faculdade… :roll:

Obrigada!!! Valeu mesmo.

Eu vou pesquisar sim, pode deixar!

E pode ficar tranquilo! E ainda nem estou na faculdade!
:grin:

Mais uma vez, obrigada!!!

Descobri um erro sutil! O método hashCode da classe Pessoa estava apenas como hash.

O hashCode na classe pessoa é uma redefinição do método hashCode da classe object. Já hash é apenas a criação de um novo método, que no contexto, nunca seria chamado…

Mas o único problema disso é perda de eficiência… Se tiver a oportunidade de estudar Estruturas de Dados, vai saber o de perda de eficiência…