• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

Hashtable iterator question

 
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi,

I have a Hashtable which I used iterate thru number of times in different methods.

//Let's say it is allocated already with some elements. When I say


It returns an iterator for the set of key elements, which are not sorted.

Assuming the key elements are 'A','B','C','D' , when I iterate thru it for the first time, I got iterator in an order of 'B', 'C', 'A', 'D'.

Now the next time I iterate thru the Hashtable again in another method, will I get the same order of Iterator 'B', 'C', 'A', 'D'. all the time?

Does anybody face this kind of scenario. I want the Iterator to return in the same order, whenever I use it. Any clues?
 
author and iconoclast
Posts: 24207
46
Mac OS X Eclipse IDE Chrome
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
You're not guaranteed to get them in the same order, no.

Instead of using Hashtable, use TreeMap. The keys are sorted and always iterated in the same order.
 
Ravi Kotha
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
But TreeMap is not that fast in retrieving the elements from right?
 
Ernest Friedman-Hill
author and iconoclast
Posts: 24207
46
Mac OS X Eclipse IDE Chrome
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
TreeMap retrieval will have performance proportional to the log of the number of elements. So if you have a million elements in the map, then retrieving an element will (in theory) be 14 times slower than if there were just one element in the map. That's really not too bad. It's not constant time like the Hashtable, but if you want the keys kept in sorted order, then you have to pay for it.
 
Ravi Kotha
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Thank you very much. So, now I am using TreeMap in place of Hashtable. I want the TreeMap to be sorted based on 'values' not on 'keys'. So, I have my own 'Comparator' which sorts based on values. I was using the same to sort 'Hashtable', but when I use the same for TreeMap, I am getting the 'ClassCaseException'.



The Key for TreeMap is a 'Hashtable' object, and value is 'Double' object.
 
Ravi Kotha
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Finally I did it, by sorting the HashTable. For some reason, I am not able to create a TreeMap which is sorted based on values. I have explained why in my last reply. If any of you have clue about it, please leave a reply. Thank you...
 
Wanderer
Posts: 18671
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Originally you just wanted to get a consistent order, not necessarily sorted. For that, I would recommend a LinkedHashMap, which will (by default) order the elements in the order they were inserted into the Map. Its performance for most operations is O(1), slower than HashMap but faster than TreeMap.

Now if you really want the entries sorted by value, using a custom Comparator in a single TreeMap fundamentally will not work. The Comparator is used to compare keys, and determine (among other things) if they're equal. If you try to use the comparator to compare values instead, the comparator will fail to detect equal keys, and the Map will become useless as you will be unable to retrieve a value using a key. The fact that you got ClassCastException probably indicates your Comparator was confused about whether it had a key or value. But fundamentally, there's no way to fix this within a single TreeMap.

I'm not sure I want to know what it means to "sort a Hashtable". But if it's working for you, good.

If each value is unique, I would probably use a second TreeMap in which the key and value are swapped. Or check out TreeBidiMap and DualTreeBidiMap from Jakarta Commons. If the values are not unique, then I'd do something like this:

Is that what you meant by sorting the Hashtable?
 
Ravi Kotha
Ranch Hand
Posts: 53
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator

@Jim Yingst,



I want a Map which gives me the iterator constanly, not necessarily sorted. As you said, LinkedHashMap may work.

Sorting a Hashtable:

I have used a custom 'comparator' which sorts the Hashtable based on values. Now, I get the Iterator in the sorted order. May be I can go with 'hashtable'. Thank you very much for your reply...

This is how I sort the Hashtable


Comparator Class:

[ May 16, 2007: Message edited by: ravi kotha ]
 
Jim Yingst
Wanderer
Posts: 18671
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Cool. Your sort was basically the same thing I did, except I see I omitted the part about casting to Map.Entry and using getValue(). Oops. The only reason your terminology confused me is that the Hashtable itself is still in the same unsorted order it was originally. But the Object[] array (or List in my example) has the contents of the Hashtable, sorted. Anyway, you probably know that - I'm just explaining my own confusion. Cheers...
 
reply
    Bookmark Topic Watch Topic
  • New Topic