Sort Collections no Java

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
 
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 str1, Object 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:
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
 
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 str1, Object str2) {
               return ((String)str1).compareTo((String)str2);
      }
}

Volto a dizer que não testei, mas deve ser algo parecido :-D
Cumps
 
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
 
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
 
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:
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:
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:
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:

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

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 :)
 
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 :)

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
 
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 :)

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).
 
Back
Topo