Solved

Sorting/printing a hasmap in a particular order

Posted on 2007-03-25
15
373 Views
Last Modified: 2010-08-05
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
Comment
Question by:dr_alinaeem
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 9
  • 4
  • 2
15 Comments
 
LVL 30

Expert Comment

by:Mayank S
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

by:Mayank S
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

by:Mayank S
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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:dr_alinaeem
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

by:Mayank S
ID: 18789299
0
 

Author Comment

by:dr_alinaeem
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

by:CEHJ
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

by:Mayank S
ID: 18789639
What is the code you used?
0
 
LVL 30

Expert Comment

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

Author Comment

by:dr_alinaeem
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

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

Accepted Solution

by:
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

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

Expert Comment

by:Mayank S
ID: 18789695
Use the Comparator which CEHJ posted instead of yours.
0
 
LVL 86

Expert Comment

by:CEHJ
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

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
servlet filter example 37 85
JavaFX TableView not displaying correctly 3 109
How to convert from xls to xlsx using java 7 96
Coding for the first time 9 70
After being asked a question last year, I went into one of my moods where I did some research and code just for the fun and learning of it all.  Subsequently, from this journey, I put together this article on "Range Searching Using Visual Basic.NET …
Basic understanding on "OO- Object Orientation" is needed for designing a logical solution to solve a problem. Basic OOAD is a prerequisite for a coder to ensure that they follow the basic design of OO. This would help developers to understand the b…
The viewer will learn how to implement Singleton Design Pattern in Java.
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.

730 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question