Ordenando um arraylist de objetos por mais de um atributo

Olá procurando por ordenação de arrayliste consegui esse código:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * Classe que implementa a solução do problema de ordenar<br>
 * uma lista de objeto.<br>
 * <br>
 * <code>
 *     Lista Tipada
 * </code>
 *
 * Onde devemos ordenar por um determinado atributo deste objeto.
 *
 */
public class OrdenarLista {

    public static void main(String[] args) {

        Pessoa p1 = new Pessoa("Vitor Hugo" , 25 , "Masculino");
        Pessoa p2 = new Pessoa("Sirley" , 25 , "Feminino");
        Pessoa p3 = new Pessoa("Ana Beatriz" , 14 , "Feminino");

        List<Pessoa> lista = new ArrayList<Pessoa>();
        lista.add(p1);
        lista.add(p2);
        lista.add(p3);

        System.out.println("Lista desordenada");
        imprimir(lista);

        Collections.sort(lista);

        System.out.println("\n Lista ordenada pelo 'Nome'");
        imprimir(lista);
    }

    private static void imprimir(List<Pessoa> lista) {
        for(Pessoa pessoa : lista) {
            System.out.print("Nome : " + pessoa.nome + " Idade : "
                        + pessoa.idade + " Sexo : " + pessoa.sexo);
        }
    }
}

// Implementa a interface Comparable
class Pessoa implements Comparable<Pessoa> {
    String nome;
    Integer idade;
    String sexo;

    public Pessoa(String nome , Integer idade , String sexo) {
        this.nome = nome;
        this.idade = idade;
        this.sexo = sexo;
    }

    public int compareTo(Pessoa o) {
        int valor = nome.compareTo(o.nome);
        return (valor != 0 ? valor : 1);
    }   
}

Esse código funciona perfeitamente para ordenar a listar por ordem alfabética de nome, porém como faço para por exemplo ordenar por idade decrescente e por nome crescente?

Basta comparar em partes:

public int compareTo(Pessoa o) {
        int valor = idade.compareTo(o.idade) * -1; //idade decrescente
        
        //se for igual, comparar por nome
        if (valor == 0){
        	return nome.compareTo(o.nome);
        }
        return valor;
    }

OK mas e se eu quer ter os dois compares no mesmo código , ou seja usei o promeiro compare para ordenar por ordem alfabetica e depois quero reordenar pelo outro compare que vc passou?

Não entendi bem o que vc quer mas sugiro que pesquise a interface Comparator. O link abaixo ja vai te ajudar bastante:
http://blog.caelum.com.br/2010/06/22/ordenando-colecoes-com-comparable-e-comparator/

[quote=OliveirakunJava]Não entendi bem o que vc quer mas sugiro que pesquise a interface Comparator. O link abaixo ja vai te ajudar bastante:
http://blog.caelum.com.br/2010/06/22/ordenando-colecoes-com-comparable-e-comparator/[/quote]

Exatamente oque estava procurando abraço

Podes fazer de varias formas, chamando o metodo Collections.sort e passando o comparator que desejas usar.

Exemplo:

import java.io.ObjectInputStream.GetField;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Classe que implementa a solução do problema de ordenar<br>
 * uma lista de objeto.<br>
 * <br>
 * <code>
 *     Lista Tipada
 * </code>
 *
 * Onde devemos ordenar por um determinado atributo deste objeto.
 *
 */
public class OrdenarLista {

	public static void main(String[] args) {

		Pessoa p1 = new Pessoa("Vitor Hugo" , 25 , "Masculino");
		Pessoa p2 = new Pessoa("Sirley" , 25 , "Feminino");
		Pessoa p3 = new Pessoa("Ana Beatriz" , 14 , "Feminino");
		Pessoa p4 = new Pessoa("Vitor Hugo" , 23 , "Masculino");
		Pessoa p5 = new Pessoa("Vitor Hugo" , 21 , "Masculino");

		List<Pessoa> lista = new ArrayList<Pessoa>();
		lista.add(p1);
		lista.add(p2);
		lista.add(p3);
		lista.add(p4);
		lista.add(p5);

		System.out.println("Lista desordenada");
		imprimir(lista);

		//informo o comparator que desejo usar
		Collections.sort(lista,Pessoa.getComparatorIdadeDescNomeCresc());
		
		//Collections.sort(lista,Pessoa.getComparatorNomeCresc());

		System.out.println("\n Lista ordenada pelo 'Nome'");
		imprimir(lista);
	}

	private static void imprimir(List<Pessoa> lista) {
		for(Pessoa pessoa : lista) {
			System.out.println("Nome : " + pessoa.nome + " Idade : "
					+ pessoa.idade + " Sexo : " + pessoa.sexo);
		}
	}
}

// Implementa a interface Comparable
class Pessoa {
	String nome;
	Integer idade;
	String sexo;

	public Pessoa(String nome , Integer idade , String sexo) {
		this.nome = nome;
		this.idade = idade;
		this.sexo = sexo;
	}

	public static Comparator<Pessoa> getComparatorIdadeDescNomeCresc() {
		return new Comparator<Pessoa>() {
			@Override
			public int compare(Pessoa o1, Pessoa o2) {
				int valor = o1.idade.compareTo(o2.idade) * -1; //idade decrescente

				//se for igual, comparar por nome
				if (valor == 0){
					return o1.nome.compareTo(o2.nome);
				}
				return valor;
			}
		};
	}
	public static Comparator<Pessoa> getComparatorNomeCresc() {
		return new Comparator<Pessoa>() {
			@Override
			public int compare(Pessoa o1, Pessoa o2) {
				return o1.nome.compareTo(o2.nome);
			}
		};
	}

}

Veja que agora a classe Pessoa nem precisa implementar a classe comparable.

Abrass

1 curtida

você pode usar o metodo:

Collections.sort(lista) // como você ta fazendo

ou usar

Collections.sort(nomes, Collections.reverseOrder()); // Ordena os elementos em ordem descendente.