Solved

# Sorting/printing a hasmap in a particular order

Posted on 2007-03-25
368 Views
I am trying to sort the following data in my hash map from:
"JOHN", 26
"TERRY", 10
"ANDY", 5
"DAVID", 5
to:
"ANDY", 5
"DAVID", 5
"TERRY", 10
"JOHN", 26

Below is that code that has been used to make this work:

HashValueComparator comparator = new HashValueComparator(mymap);
TreeMap sortedMap = new TreeMap(comparator);
sortedMap.putAll(mymap);
Object key = null;
for (Iterator i = sortedMap.keySet().iterator(); i.hasNext(); ) {
key = i.next();
System.out.println("Sorted: " + key + " => " + sortedMap.get(key));
}

class HashValueComparator implements Comparator {
private Map map = null;
public HashValueComparator(Map map) {
setMap(map);
}
public void setMap(Map map) {
this.map = map;
}
public int compare(Object o1, Object o2) {
Double DoubleA = (Double) map.get(o1);
Double DoubleB = (Double) map.get(o2);
int result = DoubleA.compareTo(DoubleB);
return result;
}
}

This works, however "DAVID", 5 overides "ANDY", 5, therefore I only get the 3 out 4 sorted elements.
Is there a way to correct this?
0
Question by:dr_alinaeem
• 9
• 4
• 2

LVL 30

Expert Comment

ID: 18789046
HashMaps are not sorted because they store data based on the hash-codes of the keys. If you want to use sorting, use a list (sorted using Collections.sort ()) or a TreeSet
0

LVL 30

Expert Comment

ID: 18789103
Ah noticed you have a TreeMap. What is the key and what is the value? Are the strings used as keys or the integers?
0

LVL 30

Expert Comment

ID: 18789121
Maybe try:

List sortedKeys = Collections.sort ( Arrays.asList ( myMap.keySet ().toArray () ) ) ;

for ( int i = 0, count = sortedKeys.size () ; i < count ; i ++ )
{
Object key = sortedKeys.get ( i ) ;
System.out.println ( "Key: " + key + ", value: " + myMap.get ( key ) ) ;

}
0

Author Comment

ID: 18789162
i tried the way you told me and i get the following error:
cannot find symbol method sort

0

LVL 30

Expert Comment

ID: 18789299
0

Author Comment

ID: 18789564
I have read this before,  I am still getting the same error, does it work on your machine?
0

LVL 86

Expert Comment

ID: 18789579
private static void sortHash() {
Map<String, Integer> map = new HashMap<String, Integer>();
map.put("JOHN", 26);
map.put("TERRY", 10);
map.put("ANDY", 5);
map.put("DAVID", 5);

List<Map.Entry<String, Integer>> entries = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> e1, Map.Entry<String, Integer> e2) {
int result = e1.getValue() - e2.getValue();
return (result == 0)? e1.getKey().compareTo(e2.getKey()) : result;
}
});
System.out.println(entries);
}
0

LVL 30

Expert Comment

ID: 18789639
What is the code you used?
0

LVL 30

Expert Comment

ID: 18789640
You're not using it the right way is all that can be said without seeing your code.
0

Author Comment

ID: 18789651
List sortedKeys = Collections.sort(Arrays.asList(Segment_Result.keySet().toArray()));

for ( int i = 0, count = sortedKeys.size () ; i < count ; i ++ )
{
Object key = sortedKeys.get ( i ) ;
System.out.println ( "Key: " + key + ", value: " + Segment_Result.get ( key ) ) ;

}
0

LVL 30

Expert Comment

ID: 18789673
Sorry, sort () does not return anything. It sorts the list passed to it.
0

LVL 30

Accepted Solution

Mayank S earned 60 total points
ID: 18789678
List<String> sortedKeys = Arrays.asList ( ( String[] ) Segment_Result.keySet().toArray ( new String[0] ) ) ;
Collections.sort ( sortedKeys ) ;

// or Collections.sort ( sortedKeys, new HashValueComparator () ) ;
0

Author Comment

ID: 18789687
this works, however i need the lowest entry at the top, e.g. lowest value first
0

LVL 30

Expert Comment

ID: 18789695
Use the Comparator which CEHJ posted instead of yours.
0

LVL 86

Expert Comment

ID: 18794546
>>this works, however i need the lowest entry at the top, e.g. lowest value first

Isn't that a contradiction in terms?

0

## Featured Post

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question