Galera, seguinte…
Eu tenho uma List de Objetos, e gostaria de saber se existe alguma classe q faz a ordenação desta lista por determinado atributo de cada objeto.
Grato,
Galera, seguinte…
Eu tenho uma List de Objetos, e gostaria de saber se existe alguma classe q faz a ordenação desta lista por determinado atributo de cada objeto.
Grato,
Utilize Collections.sort(tuaLista, tuaClasseComparator);
Onde o comparator deve implementar a interface java.util.Comparator…
Como usá-la vc pode ver na api, ali explica qual deve ser o retorno do método compare de acordo com o método de comparação q vc irá utilizar…
Fallow
[quote=TedLoprao]Utilize Collections.sort(tuaLista, tuaClasseComparator);
Onde o comparator deve implementar a interface java.util.Comparator…
Como usá-la vc pode ver na api, ali explica qual deve ser o retorno do método compare de acordo com o método de comparação q vc irá utilizar…
Fallow[/quote]
E se eu quisesse ordenar por ordem decrescente ?!?!?!?
Valews
É só inverter o sinal do número retornado pelo método compare, que você deve ter implementado ao criar a classe que implementa Comparator.
Vamos dar um exemplo simples. Rode este programa.
import java.util.Collections;
import java.util.ArrayList;
import java.util.Comparator;
/*
* Para compilar este programa:
* javac Test126.java
* Para rodar este programa (Windows):
* chcp 1252
* java -cp . Test126
* Para rodar este programa (Linux):
* java -cp . Test126
*/
class Presidente {
String nome;
int inicio;
int fim;
public Presidente(String n, int i, int f) {
nome = n; inicio = i; fim = f;
}
public String toString() {
return nome + ": de " + inicio + " até " + fim;
}
}
class Test126 {
public static void main(String[] args) {
ArrayList teste = new ArrayList();
teste.add (new Presidente ("Luis Inacio", 2002, 2005));
teste.add (new Presidente ("Fernando Henrique", 1998, 2001));
teste.add (new Presidente ("Fernando Henrique", 1994, 1997));
// Em ordem crescente do início do mandato
Collections.sort (teste, new Comparator() {
public int compare(Object o1, Object o2) {
Presidente p1 = (Presidente) o1;
Presidente p2 = (Presidente) o2;
return p1.inicio < p2.inicio ? -1 : (p1.inicio > p2.inicio ? +1 : 0);
}
});
System.out.println (teste);
// Em ordem decrescente do inicio do mandato
Collections.sort (teste, new Comparator() {
public int compare(Object o1, Object o2) {
Presidente p1 = (Presidente) o1;
Presidente p2 = (Presidente) o2;
return p1.inicio < p2.inicio ? +1 : (p1.inicio > p2.inicio ? -1 : 0);
}
});
System.out.println (teste);
}
}
Nao precisa inverter nao. Depois de ordenar:
Collections.reverse(suaLista);
Eh melhor pq vc nao fica replicando comparador
Outra opcao mais pratica e mais complicada: crie um comparador que recebe um comparador no construtor, ele retorna -1 * o que o outro comparador retornaria. Pronto, inverteu.
Seguindo a sugestão do Guilherme,
import java.util.Collections;
import java.util.List;
import java.util.ArrayList;
import java.util.Comparator;
/*
* Para compilar este programa:
* javac Test126.java
* Para rodar este programa (Windows):
* chcp 1252
* java -cp . Test126
* Para rodar este programa (Linux):
* java -cp . Test126
*/
class Presidente {
String nome;
int inicio;
int fim;
public Presidente(String n, int i, int f) {
nome = n; inicio = i; fim = f;
}
public String toString() {
return nome + ": de " + inicio + " até " + fim;
}
}
class ComparatorPresidente implements Comparator {
boolean crescente = true;
public ComparatorPresidente(boolean crescente) {
this.crescente = crescente;
}
public int compare(Object o1, Object o2) {
Presidente p1 = (Presidente) o1;
Presidente p2 = (Presidente) o2;
if (crescente) {
return p1.inicio < p2.inicio ? -1 : (p1.inicio > p2.inicio ? +1 : 0);
} else {
return p1.inicio < p2.inicio ? +1 : (p1.inicio > p2.inicio ? -1 : 0);
}
}
}
class Test126 {
public static void main(String[] args) {
List teste = new ArrayList();
teste.add (new Presidente ("Luis Inacio", 2002, 2005));
teste.add (new Presidente ("Fernando Henrique", 1998, 2001));
teste.add (new Presidente ("Fernando Henrique", 1994, 1997));
// Em ordem crescente do início do mandato
Collections.sort (teste, new ComparatorPresidente(true));
System.out.println (teste);
// Obviamente se a lista já estiver ordenada, pode-se simplesmente
// invertê-la:
Collections.reverse (teste);
// Em ordem decrescente do fim do mandato
Collections.sort (teste, new ComparatorPresidente(false));
System.out.println (teste);
}
}
Vamos melhorar mais ainda esse codigo e utilizar o que ja existe pra gente: Java 5 ahead:
class Presidente {
String nome;
int inicio, fim;
public Presidente(String n, int i, int f) {
nome = n; inicio = i; fim = f;
}
public String toString() {
return nome + ": de " + inicio + " até " + fim;
}
}
class ComparatorPresidente implements Comparator<Presidente> {
public int compare(Presidente p1,Presidente p2) {
return p1.inicio < p2.inicio ? -1 : (p1.inicio > p2.inicio ? +1 : 0);
}
}
class Test126 {
public static void main(String[] args) {
List teste = new ArrayList();
teste.add (new Presidente ("Luis Inacio", 2002, 2005));
teste.add (new Presidente ("Fernando Henrique", 1998, 2001));
teste.add (new Presidente ("Fernando Henrique", 1994, 1997));
Comparator crescente = new ComparatorPresidente();
Comparator decrescente = Collections.reverseOrder(crescente);
// Em ordem crescente do início do mandato
Collections.sort (teste, crescente);
System.out.println (teste);
// Em ordem decrescente do fim do mandato
Collections.sort (teste, decrescente);
System.out.println (teste);
}
}
Mas tomem cuidado!
public int compare(Presidente p1,Presidente p2) {
return p1.inicio - p2.inicio;
}
Tudo bem galera,
tenho o seguinte problema:
primeiro gerar todos os números entre 1 e 1000 e ordernar em ordem decrescente utilizando ArrayList.
Veja abaixo:
public class Ordernar implements Comparable<Integer>{
public static void main(String[] args) {
List<Integer> lista = new ArrayList<Integer>();
for(int i = 1; i <= 1000; i++)
lista.add(i);
Collections.sort(lista);
for(int i = 0; i < 1000; i++)
System.out.println(lista.get(i));
}
public int compareTo(Integer x) {
return 0;
//como vou fazer a implementação aqui para decrescente
// já que desejo usar Comparable?
}
}
agradeço desde já.
valeu
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Ordenar {
public static void main(String[] args) {
List<Integer> lista = new ArrayList<Integer>();
for (int i = 1; i <= 10; i++)
lista.add(i);
Collections.sort(lista);
// crescente
for (int i = 0; i < 10; i++)
System.out.println(lista.get(i));
Collections.reverse(lista);
// decrescente
for (int i = 0; i < 10; i++)
System.out.println(lista.get(i));
}
}
Desculpe te dizer, mas este tópico é de 2005.
E você chegou mais de um ano atrasado para responder o cara aí em cima (que ao invés de criar o próprio tópico foi pegar carona em um tópico que já estava morto a dois anos).
e o bambu ?
apenas fiz uma contribuição.
[no flames pls!]
Bela resposta! :lol: :lol: :lol: :lol: :lol: :lol: :lol:
Dá uma olhada neste post, pois existe um exemplo lá
http://emdia.wordpress.com/2008/11/01/ordenando-uma-lista-de-objeto/
Há uma explicação bem detalha e com um exemplo bem simples no link abaixo: