Implementação do compareTo() - Java - Portugal-a-Programar
Implementação do compareTo()
By JoinMe, November 22, 2010 in Java
JoinMe 0
Boas, é o seguinte:
Tenho uma ED do tipo
SortedMap <Long,Product> x =  new TreeMap<Long,Product>();
E tenho um método que devolve um iterador assim:
return x.values().iterator();
O objecto Product tem várias variáveis, e o que eu quero é ordenar este iterador duma certa forma tendo em conta 3 dessas variáveis. Mas não sei como ordenar. Penso que se reprogamar o compareTo dos Products, quando criar o iterador ele vai automaticamente ordenar usando o compareTo() que fiz, ou estarei errado? Digo isto porque li o seguinte no javadoc do .iterator():
O problema é que já implementei de 1001 maneiras o compareTo() e a ordem nunca altera (eu nem pedia ficar bem, mas não altera mesmo, o que dá a ideia que ele não está a usar o método.)
useware 0
Acho que a ordenação é feita nas keys e não nos valores. Da documentação:
Google+: https://plus.google.com/116337681617652538700/about
Sim, sim, eu sei que a ordenação é feita a partir das keys, mas isso é para a TreeMap. Mas eu estou a falar de ordenar o iterator que criei.
Posso estar enganado mas o iterator não se ordena. O iterator apenas percorre uma colecção esteja ela ordenada ou não.
Mas se vires o 1º post, tem lá um quote que dá a entender isso 🤔
Estive agora a ver o javadoc da interface Iterator e não vejo lá essa quote. De qualquer forma repara que na quote fala em Collection, essa sim é que deve estar ordenada segundo o que pretendes. Não sei porque estás a usar um Map mas se usares um Set podes ordenar os elementos da lista com o compareTo.
EDIT: Em vez de Set tinha posto List que também dava mas assim é mais correcto.
O que deves fazer é ordenar o resultado do método values() e depois sim, criar um iterador sobre a colecção já ordenada.
Não conheço essa funcionalidade que pedes. Sim, http://download.oracle.com/javase/6/docs/api/java/util/Collection.html#iterator() tem essa afirmação, mas deverá referir-se à implementação dos iteradores: alguns poderão dar garantias de alguma ordem, o que não é a mesma coisa de permitirem que o utilizador controle essa ordem, que é o que tu querias. Um exemplo de uma Collection cujo iterador dá garantias de ordem é o iterador devolvido para a colecção de valores de um TreeMap, que é o que estás a usar. Em http://download.oracle.com/javase/6/docs/api/java/util/TreeMap.html#values() diz-se:
Returns a Collection view of the values contained in this map. The collection's iterator returns the values in ascending order of the corresponding keys.
Não sei se existirá algum iterador que delegue a ordenação para o utilizador. É um pouco estranho, porque mistura o conceito de iteração com o de ordenação.
alexd16 0
Boas, parece me que andas a estudar na fct da nova ou estou enganado?
Não é possível ordenares o iterador, a ordenação já tem que estar efectuada na estrutura para o iterador devolver na ordem que queres.
Para isso a única forma e passar o produto como chave assim ele vai ordenar tudo na árvore usando o compare To do produto
Se quieres para não estares a ter uma estrutura tipo SortedMap<Produto,Produto> podes usar usar um SortedSet<Produto> que também faz aquilo que pretendes.