1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

JAVA Ordenar Vector Objectos

Discussão em 'Programação' iniciada por pdrnvs, 17 de Fevereiro de 2009. (Respostas: 10; Visualizações: 2597)

  1. pdrnvs

    pdrnvs Power Member

    Boas,

    A minha dúvida é a seguinte,
    Eu tenho um vector de objectos e queria ordena-los em função de um objecto do tipo GregorianCalendar.
    Por exemplo,

    Meu Vector:

    ----------------------
    pedro(nome)
    17(idade)
    data(objecto GregorianCalendar)
    ----------------------
    ana(nome)
    18(idade)
    data(objecto GregorianCalendar)
    ----------------------
    joao(nome)
    19(idade)
    data(objecto GregorianCalendar)
    ----------------------

    Ou seja, eu quero ordenar o meu vector em função do objecto data(GregorianCalendar)
    O meu código é este,

    private void setOrdenar(){
    Collections.sort (ListaPessoasE, new Comparator<Pessoa> () {
    public GregorianCalendar compare (Pessoa a1, Pessoa a2) {
    return a1.getData() - a2.getData();
    }
    });
    }


    Obrigado
     
  2. Baderous

    Baderous Banido

    O tipo de retorno do método compare é int e não GregorianCalendar.
     
  3. pdrnvs

    pdrnvs Power Member

    existe alguma forma de ordenar um vector em funcao de um objecto gregoriancalendar?
     
  4. guilherme

    guilherme Power Member

    compara com o tempo em milisegundos, já serve
     
  5. IcePicK

    IcePicK Power Member

    Duas alternativas. Não testei mas vê lá se é isso!


    Código:
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.GregorianCalendar;
    import java.util.Vector;
    
    public class Sorter {
    
    	class Pessoa [COLOR="DarkOrange"]implements Comparable<Pessoa>[/COLOR] {
    		// nome
    		// idade
    		GregorianCalendar date;
    
    		public Pessoa(GregorianCalendar date) {
    			this.date = date;
    		}
    
    		[COLOR="DarkOrange"]@Override
    		public int compareTo(Pessoa o) {
    			return this.date.compareTo(o.date);
    		}[/COLOR]
    	}
    
    	public static void main(String[] args) {
    
    		Vector<Pessoa> vector = new Vector<Pessoa>();
    		
    		//....
    
    		[COLOR="DarkOrange"]Collections.sort(vector);[/COLOR] //EDIT
    
    		[COLOR="YellowGreen"]Collections.sort(vector, new Comparator<Pessoa>() {
    
    			@Override
    			public int compare(Pessoa o1, Pessoa o2) {
    				return o1.date.compareTo(o2.date);
    			}
    
    		});[/COLOR]
    
    	}
    }
    
     
    Última edição: 18 de Fevereiro de 2009
  6. Baderous

    Baderous Banido

    Se quiseres pelo getTimeInMillis():
    Código:
    public class Pessoa implements Comparator<Pessoa>{
        private String nome;
        private GregorianCalendar nasc;
    
    public int compare(Pessoa p1, Pessoa p2) {
            return (int)(p1.getNasc().getTimeInMillis()-p2.getNasc().getTimeInMillis());
        }
    Código:
    public class Main {
        public static void main(String[] args) {
            Vector<Pessoa> v = new Vector<Pessoa>();
            GregorianCalendar n1 = new GregorianCalendar(2007,2,1);
            GregorianCalendar n2 = new GregorianCalendar(2009,3,4);
            v.add(new Pessoa("joao",n1)); v.add(new Pessoa("pedro",n2));
            Collections.sort(v,new Pessoa());
            for (Pessoa p : v)
                System.out.println(p);
            }
        }
     
  7. pdrnvs

    pdrnvs Power Member

    Obrigado icepick e baderous!!! Era mesmo isso a minha dúvida :victory:
     
  8. IcePicK

    IcePicK Power Member

    Tinha-me esquecido de uma linha no main do meu código mas já está corrigido.

    Acho que mais elegante que isso não há!
     
  9. guilherme

    guilherme Power Member

    exactamente, eu faria com o getTimeInMillis
     
  10. IcePicK

    IcePicK Power Member

    Apesar de ser uma implementação válida, isso é estar a reinventar a roda. Se verificarem a implementação do método Calendar.compareTo(Calendar anotherCalendar) vêm isto:

    Código:
    public int compareTo(Calendar anotherCalendar) {
    	return compareTo(getMillisOf(anotherCalendar));
        }
    
    ...
    
    private int compareTo(long t) {
    	long thisTime = getMillisOf(this);
    	return (thisTime > t) ? 1 : (thisTime == t) ? 0 : -1;
        }
     
  11. guilherme

    guilherme Power Member

    Foi o que me veio a cabeça sem olhar para a api, obviamente que tens razão, mas numa solução rápida aka martelada seria assim:002:
     

Partilhar esta Página