Ordenando List

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

1 curtida

[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.

1 curtida

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);
    }
}
1 curtida

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!

  1. Implementou o compareTo eh legal implementar o equals!
  2. O compareTo so deve retornar 0 quando os dois objetos sao iguais, isto eh… estamos dizendo que dois objetos sao iguais se o INICIO deles foram iguais… nao era melhor comparar o nome antes de decidir isso?
  3. Atalho do metodo compare quando temos numeros INTEIROS, muito mais compacto: :slight_smile:
     public int compare(Presidente p1,Presidente p2) {
          return p1.inicio - p2.inicio;
     }
1 curtida

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 &lt= 1000; i++)
lista.add(i);
Collections.sort(lista);
for(int i = 0; i &lt 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: