Ordenar Collection

3 respostas
rogeriosantos77

Srs, eu tenho uma collection de um objeto e preciso ordenar essa coleção baseado na combinação de 3 campos.
tipo ordenar por data e dentro da data ordenar por numero de nota e dentro da nota ordenar por item da nota.

Alguem pode me ajudar a fazer ?
tentei o Collections.sort mas so consegui ordenar por um campo.

3 Respostas

davidbuzatto

Vc precisa:

Implementar a interface Comparable (que vai fornecer o método compareTo)
E ai implementar o método compareTo, seguindo a seguinte convenção (segundo a documentação do JDK 1.6)

compareTo

int compareTo(T o)

Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object.

The implementor must ensure sgn(x.compareTo(y)) == -sgn(y.compareTo(x)) for all x and y. (This implies that x.compareTo(y) must throw an exception iff y.compareTo(x) throws an exception.)

The implementor must also ensure that the relation is transitive: (x.compareTo(y)>0 && y.compareTo(z)>0) implies x.compareTo(z)>0.

Finally, the implementor must ensure that x.compareTo(y)==0 implies that sgn(x.compareTo(z)) == sgn(y.compareTo(z)), for all z.

It is strongly recommended, but not strictly required that (x.compareTo(y)==0) == (x.equals(y)). Generally speaking, any class that implements the Comparable interface and violates this condition should clearly indicate this fact. The recommended language is "Note: this class has a natural ordering that is inconsistent with equals."

In the foregoing description, the notation sgn(expression) designates the mathematical signum function, which is defined to return one of -1, 0, or 1 according to whether the value of expression is negative, zero or positive.

Parameters:
    o - the object to be compared. 
Returns:
    a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object. 
Throws:
    ClassCastException - if the specified object's type prevents it from being compared to this object.</blockquote>
ViniGodoy

O seu compareTo ficaria parecido com isso:

compareTo(NotaFiscal other)
{
    int result = date.compareTo(other.date);
    if (result != 0) //Não são iguais?
       return result;

    //Assumindo que número da nota é sempre positivo
    result = number - other.number; 
    if (result != 0)
       return result;

    //Se ainda assim são iguais, compara por item da nota.
    return getItem().compareTo(other.getItem());
}

A interface Comparable serve par definir a ordenação padrão. Se você quer definir outras formas de ordenação (só por número, por exemplo) pode implementar um Comparator.

victorwss

java.util.Collections.sort(List<T>)

ou

java.util.Collections.sort(List<T>, Comparator<T>)

EDIT: Foi mal, não li direito a pergunta e entendi errado a sua dúvida.

Criado 18 de maio de 2008
Ultima resposta 19 de mai. de 2008
Respostas 3
Participantes 4