Comparable, compare, compareTo...ufsss..ajudai turma..como usar?

5 respostas
R

ñ consegui entender a API pessoal então peço a ajuda de vcs ne pedacinho de codigo abaixo q recebi de alguem:

private Set<String> lerArquivo (final String nomeArquivoEntrada) throws IOException {    
                Set<String> emails = new TreeSet<String>(new Comparator<String>() { // cria o conj e impoe algum tipo de ordenação. pq?   
                    public int compare (String s1, String s2) {  // qual o critério dessa ordenação?  
                        return s1.compareToIgnoreCase (s2);    
                    }

na pratica o que está acontecendo ai em cima em termos de ordenação?
e conceitualmente pq essa seq de new Comparator / compare / compareTo ?
apesar de ter um ingles razoavel nao consgui entender a API

5 Respostas

renamed

Oi

O TreeSet faz algum tipo de ordenação nos elementos inseridos na árvore (se não me engano, na inserção).
Esse Comparator que você passou é a forma que você ensina ao TreeMap como comparar os elementos que você está inserindo.

Por exemplo, digamos que você tenha a classe Pessoa.

class Pessoa { private String nome; private int idade; }

Como o TreeSet saberá qual forma ele deve usar para comparar os elementos? Pelo nome, pela idade ou por ambos?
Por padrão, o TreeSet compara pelo endereço de memória. Ou seja, duas pessoas com o mesmo nome e mesma idades são diferentes para o TreeSet. Quando você passa esse comparator no construtor, você ensina ao TreeSet qual a forma que ele deve comparar esses objetos. Existe outra forma, que é implementando a interface Comparable na sua classe (não confunda Comparable com Comparator). Uma ótima explicação está aqui http://www.guj.com.br/java/54036-comparator#284273.

O seu método compare deve retornar zero caso os dois valores informados forem iguais (por exemplo, duas pessoas com o mesmo nome), menor que zero se o primeiro valor for menor do que o segundo (nesse caso, se alfabeticamente o nome da primeira pessoa vier antes da segunda) e maior que zero se o primeiro valor for maior do que o segundo (nesse caso, se alfabeticamente o nome da primeira pessoa vier depois da segunda).

Por fim, String é uma classe da API do Java e ele tem uma forma de comparação entre duas Strings. O método compareToIgnoreCase compara duas Strings sem levar em consideração letras maísculas e minúsculas.

Portanto, esse Set de emails os ordena alfabeticamente por email.

R

Hi men!!!
cara primeiramente vc deve ter perdido um boa tempo pra escrever tanto e tão didaticamente bem. A mais de 48 hs to travado esperando um ajuda assim. Então irmao valeu mesmo. really thank’s :thumbup:
bom, clareou legal, agora só mais umas confirmações eu eu matei essa rsss…(coloquei junto a teus coments)

renamed:
Oi

O TreeSet faz algum tipo de ordenação nos elementos inseridos na árvore (se não me engano, na inserção).
Esse Comparator que você passou é a forma que você ensina ao TreeMap como comparar os elementos que você está inserindo.

Por exemplo, digamos que você tenha a classe Pessoa.

class Pessoa { private String nome; private int idade; }

1.Como o TreeSet saberá qual forma ele deve usar para comparar os elementos? Pelo nome, pela idade ou por ambos?
Por padrão, o TreeSet compara pelo endereço de memória. Ou seja, duas pessoas com o mesmo nome e mesma idades são diferentes para o TreeSet. Quando você passa esse comparator no construtor, você ensina ao TreeSet qual a forma que ele deve comparar esses objetos. Existe outra forma, que é implementando a interface Comparable na sua classe (não confunda Comparable com Comparator). Uma ótima explicação está aqui http://www.guj.com.br/java/54036-comparator#284273.

-quer dizer então sempre que eu usar TreeSet (filha de TreeMap acho) eu tenho de me lembrar de que ordem vai ser feita por end de memoria ou se me esquecer disso e achar q eles vao entrar no conjunto pela ordem de inserção poderei ter problemas inesperados mais tarde, nas consultas por ex, então sempre terei de usar um Comparator e ainda por cima implementar um metodo compare(obj1, obj2); correto?

2.O seu método compare deve retornar zero caso os dois valores informados forem iguais (por exemplo, duas pessoas com o mesmo nome), menor que zero se o primeiro valor for menor do que o segundo (nesse caso, se alfabeticamente o nome da primeira pessoa vier antes da segunda) e maior que zero se o primeiro valor for maior do que o segundo (nesse caso, se alfabeticamente o nome da primeira pessoa vier depois da segunda).

-quer dizer então que para o TreeSet formar o conj, antes o metodo copare(obj1, obj2); ordena e para tanto, se cada email equivale uma linha no arquivo.txt, quer dizer que ele le e armazena 2 linhas (dois emails ao mesmo tempo) pra efetuar a compração ou o TreeSet adiciona os dois objetos no conj. e o metodo compare(obj1, obj2); faz a ordenação após ja estarem contidos? achei isso meio confuso e nem sei se estou certo quanto ao que disse. (tb nao sei se isso é relevantes saber)

3-Por fim, String é uma classe da API do Java e ele tem uma forma de comparação entre duas Strings. O método compareToIgnoreCase compara duas Strings sem levar em consideração letras maísculas e minúsculas.

resumindo então /usei TreeSet/Tive de usar Comparator pra não ter ordenação padrão do TreeSet/Como usei Comparator fui obrigado a implementar o metodo compare(obj1, obj2); pra instruir o Comparator como seria feira a ordenação/Ja q estava comparando strings usei o String1.compareToIgnoreCase (String2) pra finalizar implementação do metodo compare(obj1, obj2); - falei certo ?

Portanto, esse Set de emails os ordena alfabeticamente por email.

ufss… demorei qse 1 hora pra formular minhas perguntas …mas to a um passito de entender tudo!
Ultima pergunta: Na formação de um desenvolvedor java a parte mais difici é a correta compreensão da pratica de O.O. ou o mais dificil ainda está por vir ?
mais uma vez obrigado pela ajuda brou!

renamed

Essa é uma pergunta muito complexa!
Dificuldades sempre existirão, mas saber OO é o passo mais importante para programar bem em Java.

Lucas_Abbatepaolo

Com a explicacao dada acima creio q nao deve haver mais duvidas…
Sobre OO entenda como o basico…ja q a linguagem java eh baseada em OO…
Dificuldades vao surgir junto com a necessidade de aprender novas APIs e frameworks.

R

Lucas Abbatepaolo:
Com a explicacao dada acima creio q nao deve haver mais duvidas…
Sobre OO entenda como o basico…ja q a linguagem java eh baseada em OO…
Dificuldades vao surgir junto com a necessidade de aprender novas APIs e frameworks.

isso abaixo que escrevi está certo?
/usei TreeSet/Tive de usar Comparator pra não ter ordenação padrão do TreeSet/Como usei Comparator fui obrigado a implementar o metodo compare(obj1, obj2); pra instruir o Comparator como seria feira a ordenação/pra finalizar implementação do metodo compare(obj1, obj2); (ja q estava comparando strings) usei o String1.compareToIgnoreCase (String2)

Criado 19 de novembro de 2011
Ultima resposta 19 de nov. de 2011
Respostas 5
Participantes 3