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.