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

Sort Collections no Java

Discussão em 'Programação' iniciada por Pure_Water, 21 de Janeiro de 2007. (Respostas: 16; Visualizações: 2879)

  1. Pure_Water

    Pure_Water Power Member

    Boas,

    tenho uma ArrayList de um objecto constituido por duas string's. sabem-me dizer se posso usar o metódo sort do Collections para ordenar a lista?

    a minha ideia era usar o sort para ordenar as Strings (a primeira de cada objecto) alfabeticamente, mas nao estou a conseguir usar o sort :S
     
  2. MadOnion

    MadOnion Folding Member

    Boas,
    A classe Collections dispõe de um metodo para isso, o sort();
    Não funciona apenas Collections.sort(nomeDaArrayList);

    Em todo o caso há outro metodo da Collections que é o sort() com dois argumentos. Em que recebe a lista(ArrayList) e um comparador. Em que o comparador compara dois objectos(duas strings por exemplo):

    PHP:
     private classe ComparaStrings implements Comparator 

       public 
    int comparaStrings(Object str1Object str2) {
          return ((String)
    str1).compareTo((String)str2); 
       }
     }

    public 
    void ordenaLista() {

    Collections.sort(nomeDaLista, new ComparaStrings());
    }
    Classe Collections e Comparator - Esta ultima classe tem um metodo para comparar dois objectos e retorna um inteiro, negativo se str1 < str2, 0 se str1 == str2, e positivo se str1 > str2.

    Espero que funcione, não testei código :)
    Cumps
     
    Última edição: 21 de Janeiro de 2007
  3. Pure_Water

    Pure_Water Power Member

    pois, ja tinha tentado o Comparator mas n consegui nada :S

    resolvi passando o primeiro argumento da tal lista de objecto para um ArrayList de Strings e como esse ja dava pa fazr sort com o Collections.sort, fiz-lhe o sort. Depois foi so comparar as String's desse com a da outra lista, e passar os dados bem para outra ^^

    thkx pela ajuda :D
     
  4. MadOnion

    MadOnion Folding Member

    Usas uma lista auxiliar então? Pode ser uma solução, mas não tão elegante quanto aquela que eu apresentei :)

    Em detrimento das duas alternativas que apresentei ainda há outra, que é implementar logo o metodo em vez da criação de uma classe auxiliar, por exemplo:

    PHP:
    public void ordenaLista() {

    Collections.sort(nomeDaLista, new Comparator 
          public 
    int compare(Object str1Object str2) {
                   return ((String)
    str1).compareTo((String)str2);
          }

    Volto a dizer que não testei, mas deve ser algo parecido :-D
    Cumps
     
  5. Pure_Water

    Pure_Water Power Member

    ya, uso uma lista aux, pois, e fica tb maior o codigo.

    vou ver se experimento por esse OrdenaLista como metodo da class, é k n sei pk eu tinha tentado antes fzr implements ao Comparator e tava a dar erro :(

    thkx :D
     
  6. MadOnion

    MadOnion Folding Member

    Já agora és da fcul? Tive a ver o teu site, e todos os programas que fizeste em java, eu fi-los em LabP o ano passado :P
     
  7. Pure_Water

    Pure_Water Power Member

    ya sou :D akeles programas que tão lá foram os k fiz em LabP o ano passado :P

    eram mais mas dava mt trabalho por la lol
     
  8. guilherme

    guilherme Power Member

    em alternativa podes usar o TreeSet em vez do ArrayList, q tem os métodos do ArrayList com a diferença que ordena os objectos como tu quiseres. A unica coisa que tens de fazer é nos objectos que vais incluir no treeSet implementares a interface Comparable com 1 parametro, no teu caso, provavelmente será uma das strings.
    A partir daqui qualquer objecto que adicionares ficara automaticamente ordenado.
    Se quiseres usar ArrayList, apesar de ser igual ao TreeSet, importares a seguinte biblioteca: import java.util.Collections;

    e crias por ex 1 método auxiliar que te faz o sort, sempre que desejares:
    public void sort()
    {
    Collections.sort(ArrayList);
    }

    ja na classe do objecto que suponho eu que tens as duas strings incluis a interface:
    public abstract class OTeuObjecto implements Comparable<OTeuObjecto>

    e depois basta acrescentares o método compareTo()

    public int compareTo(OTeuObjecto obj)
    {
    return OTeuObjecto.getStr().compareTo(this.getStr());
    }

    atenção que este compareTo é mero exemplo, nao sei quais os teus parametros de ordenação,
    Esta implementação tem de ser efectuado com ArrayList ou TreeSet, a unica coisa que os diferencia é a ordenação automática.

    Espero ter ajudado
     
  9. Pure_Water

    Pure_Water Power Member

    boas guilherme, o código da classe do objecto é esta:

    Código:
    public class Url{
    	
    	String nome;
    	String url;
    	
    	Url(String name,String link){
    		nome = name;
    		url = link;
    	}
    	
    	String getNome(){
    		return nome;
    	}
    
    	String getUrl(){
    		return url;
    	} 
    }
    basicamente o que teria de fazer era:

    Código:
    public class Url implements Comparable<Url>{
    	
    	String nome;
    	String url;
    	
    	Url(String name,String link){
    		nome = name;
    		url = link;
    	}
    	
    	String getNome(){
    		return nome;
    	}
    
    	String getUrl(){
    		return url;
    	} 
         
            int compareTo(Url url1,Url url2){
                   return url1.getNome().compareToIgnoreCase(url2.getNome()); //assim ordenava por nome
    }
    }
    teria que usar o compareTo assim?ou é doutra forma?

    depois o Collections.sort poderia usar logo directamente no codigo do main, visto que aí o ArrayList<Url> já seria aceite pelo sort ja que tinha o Comparable implementado certo?

    thkx pela ajuda :D

    MadOnion, btw és de que ano?
     
    Última edição: 22 de Janeiro de 2007
  10. MadOnion

    MadOnion Folding Member

    Sou do 2º ano, provavelmente devo fazer melhoria a LabP para não perceber o contacto com Java, porque DCO só vou fazer no próximo ano. :)
     
  11. guilherme

    guilherme Power Member

    pera la, mas afinal tu queres comparar o que? essa classe url é o tipo de objectos que vais guardar no ArrayList doutra classe?

    o método compareTo o que faz é comparar objectos ou seja, no método compareTo so recebes 1 objecto do tipo url, se queres ordenar por nome deve ficar algo deste tipo:

    public int compareTo(Url url)
    {
    return this.getNome().compareToIgnoreCase(url.getNome());
    }

    da 1 olhadela aqui:
    http://java.sun.com/j2se/1.5.0/docs/api/java/lang/Comparable.html

    anyway, é boa politica usares public e private nos métodos, bem como nos atriutos.
    Ja no construtor n precisas de ter nomes diferentes nos cabeçalhos, podes fazer assim:

    public Url(String nome,String url)
    {
    this.nome = nome;
    this.url = url;
    }

    nome é variável local, this.nome é variável global

    Visto que vais usar o sort directamente no main basta meteres a seguinte linha de código:
    Collections.sort(OTeuArrayList);
    nao esquecendo o import: import java.util.Collections;
    agora eu te digo, faz apenas 1 teste, em todos os sitios q tens ArrayList substitui por TreeSet e faz o import da biblioteca e esquece o sort manual, e depois diz me se n preferes, os métodos sao os mesmos. A n ser que te tenham obrigado a usar o ArrayList.
    Depois diz se funcionou
    cumps
     
    Última edição: 23 de Janeiro de 2007
  12. guilherme

    guilherme Power Member

    bem, n te ficava mal dizeres se tudo funcionou, pelo menos.
     
  13. Pure_Water

    Pure_Water Power Member

    boas guilherme,

    sorry ainda n ter dito nada mas ontem tive no vício do Lost, então nem olhei para o programa lol

    olha fiz como tinhas dito,

    fiz o implements Comparable<Url> na class,

    e depois fiz o compareTo e ja ta a funcionar :D

    ja aprendi mais uma coisita. btw, fazes ideia porque é que no Eclipse da-me erro ao tentar criar ArrayLists de um objecto? tipo se fizer ArrayList<Url> no eclipse, dá erro no <, diz token nao sei das quantas. Mas tanto no emacs, como jgrasp, etc, dá tudo bem a compilar :s tenho o eclipse com a ultima versão e penso que ele tb ta a apontar para a ultima versao do java (1.6) :S

    pa eu normalmente só meto os public's quando é para trabalhos da univ, para ficar bonitinho e tal ^^ ou trabalhos importantes. Como este proggie era mais para me entreter um bcd (visto ja n mexer em java a mt tempo), e como o java mete o public por omissão, nao meti nada, embora me tivesse realmente eskecido de por os privates nos atributos da classe, enfim, é da ferrugem :lol:

    por acaso nunca usei o TreeSet, acho que só usei o HashSet, que nao dá mt jeito imo. Qual é a vantagem do TreeSet sobre o ArrayList(tenho-o usado o ArrayList meramente por uma razão de hábito lol)? Podes criar tipo logo uma ordenação dos objectos?

    thkx MadOnion e guilherme pela ajuda, isto ja ta a bombar :x2:
     
    Última edição: 24 de Janeiro de 2007
  14. MadOnion

    MadOnion Folding Member

    Exacto o guilherme tem razão.
    HashSet-> Lista(conjunto) de objectos não ordenados.
    TreeSet-> Lista de objectos ordenados
    ArrayList-> Lista que pode ou não ser ordenada.

    No caso no TreeSet é só fazeres o implements do Comparable<Object> que à medida que vais colocando objectos ele ordena.
     
  15. El_UnO

    El_UnO 1st Folding then Sex

    Só um reparo...quando não metes nada os atributos/métodos não ficam públicos mas sim "package protected". Ou seja, só é acessível dentro da mesma classe ou do mesmo pacote :P

    Mais info aqui

    Para as colecções e tal nada como ler bem o Javadoc. Ajuda bastante quando se trabalha com um determinado tipo de dados e a ver as vantagens e desvantagens de cada um deles :)
     
  16. guilherme

    guilherme Power Member

    Exactamente, o package protected na pratica é 1 public apenas acessivel no mesmo pacote, nao reparavas nisso pois nunca usavas os métodos/atributos noutros pacotes.
    Temos ainda o private, neste caso os atributos/métodos são acessíveis hierarquicamente. Sa algum jeito nas heranças embora eu prefira atributos private com métodos public.

    cumps
     
  17. Pure_Water

    Pure_Water Power Member

    ahh olha boa info, n fazia ideia. de vez em quando uso metodos private dentro da propria classe mas n sabia k havia diferença entre meter public ou deixar sem nada (o tal no modifier).
     

Partilhar esta Página