[RESOLVIDO] Problema Ordenação de objeto por duas enums ao mesmo tempo

5 respostas
brunoties

Olá pessoal,

Estou com problemas para ordenar objetos em uma List, por dois atributos do tipo enum ao mesmo tempo.

Tenho com uma classe Carta, que tem duas Enums, TipoNipe e TipoValor, preciso ordenar a mão do jogador, colocando todas as cartas com o mesmo nipe juntas e da menor para a maior valor.
Estou há uns 3 dias tentando fazer isso, tentei implementar de diversas formas, que eu entendia e que pesquisava, mas não obtive sucesso.

Eu tenho uma Classe ConjuntoCartas, Mao extends ConjuntoCartas, MaoJogoEspecifico extends Mao, que tem o método organizar()

O método compareTo em Carta, ficou assim:

Versão 1
@Override
    public int compareTo(Carta carta) {
 if (this.getNipe().ordinal() < carta.getNipe().ordinal()) {
            return -1;
        } else if (this.getNipe().ordinal() > carta.getNipe().ordinal()) {
            return 1;
        } else if (this.getNipe().ordinal() == carta.getNipe().ordinal()) {
            return this.getValor().compareTo(carta.getValor());
        } else {
            return 0;
        }
Versão 2
@Override
    public int compareTo(Carta carta) {
 if (this.getNipe().ordinal() > carta.getNipe().ordinal()) {
            return 2;
        }  if (this.getNipe().ordinal() < carta.getValor().ordinal()) {
            return -2;
        }  if (this.getNipe().ordinal() == carta.getNipe().ordinal()) {
            return 0;
        }
        if (this.getValor().ordinal() > carta.getValor().ordinal()) {
            return 1;
        }  if (this.getValor().ordinal() < carta.getValor().ordinal()) {
            return -1;
        }  if (this.getValor().ordinal() == carta.getValor().ordinal()) {
            return 0;
        } else return 0;
}
Versão 3
@Override
    public int compareTo(Carta carta) {
        
        if (this.getNipe().ordinal() != 0) {
            return this.getNipe().compareTo(carta.getNipe());
        }
        else if (this.getNipe().ordinal() == carta.getNipe().ordinal()) {
            return this.getValor().compareTo(carta.getValor());
        } else {
            return 0;
        }}

O método organizar em MaoJogoEspecifico ficou assim

@Override
    public void organizar() {
        Collections.sort(cartas);
    }

Pessoal, peço a ajuda para entender melhor como utilizar essa técnica de ordenação ou uma melhor.

Desculpem pelo excesso ou omissão de dados, sou novato também em fóruns...

5 Respostas

wagnerfrancisco

Na versão 3, acho que o que tu queria era mais ou menos isto:

@Override
public int compareTo(Carta carta) {
   int resultadoNaipe = this.getNipe().compareTo(carta.getNipe());

   if (resultadoNaipe != 0) {
      return resultadoNaipe;
   }

   /* naipe eh igual, compare valores */
   return this.getValor().compareTo(carta.getValor());
}
brunoties

Olá Wagner,

rapaz, ordenou que foi uma beleza…

Desculpe o abuso, mas você poderia me explicar o “por que” de não ter funcionado na versão 3 e funcionado nessa, o que estava errado?

Muito obrigado…

brunoties

Eu acho que entendi o por que de não ter funcionado na versão 3, eu estava comparando apenas se o nipe da carta não era o primeiro nipe… Agora fiz algumas modificação, aproveitando ela e funcionou beleza também, acredito ter entendido.

Deixa eu aproveitar, e se eu quisesse exibir do maior para o menor? Eu teria que usar os retornos -1 e 1 nos compareTo?

wagnerfrancisco

Exato!

Você precisaria de uma implementação do compareTo que retornasse invertido. Como você já implementou a ordenação natural nas suas classes (e é esta que deve estar lá), você pode usar um comparator que inverte a ordem natural. Na API do Java já tem o Collections.reverseOrder, basta utilizá-lo:

public void organizar() {
   Collections.sort(cartas, Collections.reverseOrder());
}
brunoties

Show…

Mais uma vez muito obrigado Wagner…

Criado 30 de setembro de 2012
Ultima resposta 1 de out. de 2012
Respostas 5
Participantes 2