View Full Version : Sort Collections no Java


Pure_Water
21-01-2007, 00:08
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

MadOnion
21-01-2007, 01:21
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):


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 (http://java.sun.com/j2se/1.4.2/docs/api/java/util/Collections.html#sort(java.util.List) e Comparator (http://java.sun.com/j2se/1.4.2/docs/api/java/util/Comparator.html) - 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

Pure_Water
21-01-2007, 02:55
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

MadOnion
21-01-2007, 11:21
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:


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

Pure_Water
21-01-2007, 18:48
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

MadOnion
21-01-2007, 19:50
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

Pure_Water
21-01-2007, 21:15
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

guilherme
22-01-2007, 02:50
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

Pure_Water
22-01-2007, 03:03
boas guilherme, o código da classe do objecto é esta:

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:

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?

MadOnion
22-01-2007, 14:04
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. :)

guilherme
23-01-2007, 03:45
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

guilherme
24-01-2007, 04:19
bem, n te ficava mal dizeres se tudo funcionou, pelo menos.

Pure_Water
24-01-2007, 08:45
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:

MadOnion
24-01-2007, 10:00
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.

El_UnO
24-01-2007, 22:48
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 (http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)

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

guilherme
25-01-2007, 03:18
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 (http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)

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

Pure_Water
25-01-2007, 07:25
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 (http://java.sun.com/docs/books/tutorial/java/javaOO/accesscontrol.html)

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