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

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

[code] @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;
    }}[/code]

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…

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());
}

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…

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?

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());
}

Show…

Mais uma vez muito obrigado Wagner…