Jump to content
JoinMe

Implementação do compareTo()

Recommended Posts

JoinMe

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

There are no guarantees concerning the order in which the elements are returned (unless this collection is an instance of some class that provides a guarantee).

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

Agradecia ajuda  :P

Share this post


Link to post
Share on other sites
useware

Acho que a ordenação é feita nas keys e não nos valores. Da documentação:

TreeMap

public TreeMap(Comparator<? super K> comparator)

Constructs a new, empty tree map, ordered according to the given comparator. All keys inserted into the map must be mutually comparable by the given comparator: comparator.compare(k1, k2) must not throw a ClassCastException for any keys k1 and k2 in the map. If the user attempts to put a key into the map that violates this constraint, the put(Object key, Object value) call will throw a ClassCastException.

Parameters:

comparator - the comparator that will be used to order this map. If null, the natural ordering of the keys will be used.

Share this post


Link to post
Share on other sites
JoinMe

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.

Share this post


Link to post
Share on other sites
useware

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.

Share this post


Link to post
Share on other sites
Baderous

O que deves fazer é ordenar o resultado do método values() e depois sim, criar um iterador sobre a colecção já ordenada.

Share this post


Link to post
Share on other sites
daj

Olá,

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.

Share this post


Link to post
Share on other sites
alexd16

Boas, parece me que andas a estudar na fct da nova ou estou enganado? :D

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.

cumps;)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.