Results 1 to 10 of 10
  1. #1
    chiba is offline Member
    Join Date
    May 2013
    Posts
    6
    Rep Power
    0

    Question Arrays vs HashMaps vs TreeSets - best method for sorting ability

    Hi guys,

    I have written a program to rad in data and add it to a HashMap. The thing is now I want to sort it and I think it's not possible with HashMaps. I am also interested in adding a second piece of data.

    Output is

    {Barton Bank=23660, Senor El Betrutti=25190, General Wolfe=17820, Dawn Run=26500, Uncle Ernie=15270, Alydar=22920, The Grey Monk=23120, Stalbridge Colonist=26620, Master Oats=22620, Assault=20290, Affirmed=17730, Poliantas=25130, Bobbyjo=25190, Lady Rebecca=18780, Lord Gyllene=19360, Rough Quest=20880, Norton's Coin=22460, Wayward Lad=23290, Young Kenny=20610, Afleet Alex=24860, Cab On Target=15320, Pridwell=20190, Voy Por Ustedes=22760}
    I need to sort but the Integer value and it would be useful to add a count for each horse. Any ideas on the correct data structure?

    Java Code:
    import java.io.File;
    import java.util.Hashtable;
    import java.util.Scanner;
    import java.util.Iterator;
    import java.util.HashSet;
    import java.util.HashMap;
    
    public class bets {
    
    	public static void main (String[] args)
    	{
            File file = new File("horses.tsv");
            
            HashMap<String, Integer> race = new HashMap<String, Integer>();
            boolean hexists;
        	
        	try
        	{
        		Scanner scanner = new Scanner(file);
    	    	String line = scanner.nextLine();
    	    	int amount;
    	    	String horse;
    	    	String[] parts;
    	    	while (line != null)
    	    	{
    	            line = scanner.nextLine();
    	            parts = line.split("\t");
    	            horse=parts[0];
    	            hexists = race.containsKey(horse);
    	            amount=Integer.parseInt(parts[1]);
    	            if (hexists)
    	            {
    		            amount=race.get(horse)+amount;
    		            race.put(horse, amount);
    	            }
    	            else
    	            {
    	            	race.put(horse, amount);
    	            	
    	            }
    	    	}
    	    	
        	}
        	catch (Exception e) 
        	{
                //System.out.println(e);
                
            }
        	System.out.println(race);   	
        	
    	}
    }

  2. #2
    jim829 is offline Senior Member
    Join Date
    Jan 2013
    Location
    Northern Virginia, United States
    Posts
    3,540
    Rep Power
    5

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    Ok, let me try this again (I deleted an earlier post). You can use SortedMap and TreeMap to create a map which maintains sorted entries. Keys or values returned from keySet or values() will be in a sorted order based on the natural ordering of the elements.

    Lists vs arrays. I tend to favor Lists because their more versatile and almost as efficient. Lists vs Maps. It depends on what you want to do. Lists are only indexed by ints and values must be added sequentially. With maps, you can use any object as a key and order is irrelevant.

    Regards,
    Jim
    The Java™ Tutorial | SSCCE | Java Naming Conventions
    Poor planning our your part does not constitute an emergency on my part.

  3. #3
    chiba is offline Member
    Join Date
    May 2013
    Posts
    6
    Rep Power
    0

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    Ok, so tried using a SortedMap as you suggested. I need the sort to be on the value though.

    I suppose I could insert the data into a new SortedMap at the end using the value as the key instead of the horse name..

    Java Code:
    import java.io.File;
    import java.util.*;
    
    public class sortedmap_bets {
    	
    	public static void main(String[] args)
    	{
    		File file = new File("horses.tsv");
    		SortedMap map = new TreeMap();
    		boolean hexists;
        	try
        	{
        		Scanner scanner = new Scanner(file);
            	String line = scanner.nextLine();
            	int amount;
            	String horse;
            	String[] parts;
            	
    	    	while (line != null)
    	    	{
    	            line = scanner.nextLine();
    	            parts = line.split("\t");
    	            horse=parts[0];
    	            
    	            hexists = map.containsKey(horse);
    	            amount=Integer.parseInt(parts[1]);
    	            if (hexists)
    	            {
    		            amount=(int)map.get(horse)+amount;
    	            	map.put(horse, amount);
    	            }
    	            else
    	            {
    	            	map.put(horse, amount);
    	            	
    	            }
    	    	}
        	}
        	catch(Exception e)
        	{
        		//System.out.println(e);
        	
        	}
    		  Iterator iterator = map.keySet().iterator();
    		  while (iterator.hasNext()) 
    		  {
    		  Object key = iterator.next();
    		  System.out.println("key : " + key + " value :" + map.get(key));
    		  }
    	}
    }
    key : Affirmed value :17730
    key : Afleet Alex value :24860
    key : Alydar value :22920
    key : Assault value :20290
    key : Barton Bank value :23660
    key : Bobbyjo value :25190
    key : Cab On Target value :15320
    key : Dawn Run value :26500
    key : General Wolfe value :17820
    key : Lady Rebecca value :18780
    key : Lord Gyllene value :19360
    key : Master Oats value :22620
    key : Norton's Coin value :22460
    key : Poliantas value :25130
    key : Pridwell value :20190
    key : Rough Quest value :20880
    ...
    Last edited by chiba; 05-28-2013 at 03:45 PM.

  4. #4
    jim829 is offline Senior Member
    Join Date
    Jan 2013
    Location
    Northern Virginia, United States
    Posts
    3,540
    Rep Power
    5

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    Assuming you are using Integer values for your currency,

    Java Code:
    SortedMap<String, Integer> bets = new TreeMap<>(); // Java 1.7 syntax
    //   or
    SortedMap<String, Integer> bets = new TreeMap<String, Integer>() // Java 1.5 and later.
    
    bets.put("Secretariat", 1000000);
    Regards,
    Jim
    The Java™ Tutorial | SSCCE | Java Naming Conventions
    Poor planning our your part does not constitute an emergency on my part.

  5. #5
    chiba is offline Member
    Join Date
    May 2013
    Posts
    6
    Rep Power
    0

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    Java Code:
    import java.io.File;
    import java.util.Iterator;
    import java.util.Scanner;
    import java.util.SortedMap;
    import java.util.TreeMap;
    
    
    public class smap_bets {
    
    	public static void main(String[] args)
    	{
    		File file = new File("horses.tsv");
    		SortedMap<String, Integer> map = new TreeMap<>();
    		boolean hexists;
        	int amount;
        	String horse;
        	String[] parts;
        	
        	try
        	{
        		Scanner scanner = new Scanner(file);
            	String line = scanner.nextLine();
            	
    	    	while (line != null)
    	    	{
    	            line = scanner.nextLine();
    	            parts = line.split("\t");
    	            horse=parts[0];
    	            
    	            hexists = map.containsKey(horse);
    	            amount=Integer.parseInt(parts[1]);
    	            if (hexists)
    	            {
    		            amount=(int)map.get(horse)+amount;
    	            	map.put(horse, amount);
    	            }
    	            else
    	            {
    	            	map.put(horse, amount);
    	            	
    	            }
    	    	}
        	}
        	catch(Exception e)
        	{
        		//System.out.println(e);
        	}
    
        	SortedMap<Integer, String> bets = new TreeMap<>();
        	
        	//add to a new SortedMap using the amount as key
    		  Iterator iterator = map.keySet().iterator();
    		  while (iterator.hasNext()) 
    		  {
    			  Object key = iterator.next();
    			  amount=map.get(key);
    			  horse=(String)key;
    			  bets.put(amount, horse);
    		  }
    		  
    		  //print out
    		  iterator = bets.keySet().iterator();
    		  while (iterator.hasNext()) 
    		  {
    			  Object key = iterator.next();
    			  System.out.println(" £" +key + " " + bets.get(key));
    		  }
    	}
    }
    £15270 Uncle Ernie
    £15320 Cab On Target
    £17730 Affirmed
    £17820 General Wolfe
    £18780 Lady Rebecca
    £19360 Lord Gyllene
    £20190 Pridwell
    £20290 Assault
    £20610 Young Kenny
    £20880 Rough Quest
    £22460 Norton's Coin
    £22620 Master Oats
    £22760 Voy Por Ustedes
    £22920 Alydar
    £23120 The Grey Monk
    £23290 Wayward Lad
    £23660 Barton Bank
    £24860 Afleet Alex
    £25130 Poliantas
    £25190 Senor El Betrutti
    £26500 Dawn Run
    £26620 Stalbridge Colonist
    Now the amounts are sorted asc in order of amount

  6. #6
    chiba is offline Member
    Join Date
    May 2013
    Posts
    6
    Rep Power
    0

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    That's what I wanted to do...

    Java Code:
    import java.io.File;
    import java.util.Iterator;
    import java.util.Map;
    import java.util.NavigableMap;
    import java.util.Scanner;
    import java.util.SortedMap;
    import java.util.TreeMap;
    
    
    public class smap_bets {
    
    	public static void main(String[] args)
    	{
    		File file = new File("horses.tsv");
    		//SortedMap<String, Integer> map = new TreeMap<>();
    		NavigableMap<String, Integer> map = new TreeMap<String, Integer>();
    		boolean hexists;
        	int amount;
        	String horse;
        	String[] parts;
        	
        	try
        	{
        		Scanner scanner = new Scanner(file);
            	String line = scanner.nextLine();
            	
    	    	while (line != null)
    	    	{
    	            line = scanner.nextLine();
    	            parts = line.split("\t");
    	            horse=parts[0];
    	            
    	            hexists = map.containsKey(horse);
    	            amount=Integer.parseInt(parts[1]);
    	            if (hexists)
    	            {
    		            amount=(int)map.get(horse)+amount;
    	            	map.put(horse, amount);
    	            }
    	            else
    	            {
    	            	map.put(horse, amount);
    	            	
    	            }
    	    	}
        	}
        	catch(Exception e)
        	{
        		//System.out.println(e);
        	}
    
        	//SortedMap<Integer, String> bets = new TreeMap<>();
        	NavigableMap<Integer, String> bets = new TreeMap<Integer, String>();
        	
        	//add to a new SortedMap using the amount as key
    		  Iterator iterator = map.keySet().iterator();
    		  while (iterator.hasNext()) 
    		  {
    			  Object key = iterator.next();
    			  amount=map.get(key);
    			  horse=(String)key;
    			  bets.put(amount, horse);
    		  }
    		  
    
    		  
    			for (Map.Entry<Integer, String> e : bets.descendingMap().entrySet()) {
    			    System.out.println(e);
    			}
    	}
    }
    26620=Stalbridge Colonist
    26500=Dawn Run
    25190=Senor El Betrutti
    25130=Poliantas
    24860=Afleet Alex
    23660=Barton Bank
    23290=Wayward Lad
    23120=The Grey Monk
    22920=Alydar
    22760=Voy Por Ustedes
    22620=Master Oats
    22460=Norton's Coin
    20880=Rough Quest
    20610=Young Kenny
    20290=Assault
    20190=Pridwell
    19360=Lord Gyllene
    18780=Lady Rebecca
    17820=General Wolfe
    17730=Affirmed
    15320=Cab On Target
    15270=Uncle Ernie

  7. #7
    jim829 is offline Senior Member
    Join Date
    Jan 2013
    Location
    Northern Virginia, United States
    Posts
    3,540
    Rep Power
    5

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    I am not certain what the problem is but I assume want to change the natural ordering of the map to descending order. To do that you can provide your own Comparator. Check out the Comparator API.

    Typical usage would be:


    Java Code:
    // create anonymous class
    Comparator<Integer> comp = new Comparator<Integer>() {
            public int compare(Integer a, Integer b) {
               return b.compareTo(a);
            }
    };
    
    SortedMap<Integer, String> bets = new TreeMap<comp>();
    Regards,
    Jim
    Last edited by jim829; 05-28-2013 at 08:29 PM. Reason: clarification
    The Java™ Tutorial | SSCCE | Java Naming Conventions
    Poor planning our your part does not constitute an emergency on my part.

  8. #8
    chiba is offline Member
    Join Date
    May 2013
    Posts
    6
    Rep Power
    0

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    I can't really understand how to store and sort the data

    Affirmed £17730
    Afleet Alex £24860
    Alydar £22920
    Assault £20290
    Barton Bank £23660
    Bobbyjo £25190

    If my data is like the above stored in SortedMap then I can only sort by the key eg 'Barton Bank', but I want to sort by the amount.
    SortedMap map = new TreeMap();
    I can easily create a new SortedMap and use the Integer amount as the key, but it seems like a waste of memory.

  9. #9
    jim829 is offline Senior Member
    Join Date
    Jan 2013
    Location
    Northern Virginia, United States
    Posts
    3,540
    Rep Power
    5

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    Well, there is nothing wrong with doing it that way. It is probably the most direct way in fact. Otherwise you could simply use a List with entries of the form

    Java Code:
    class MyEntry {
        String key;
        Integer value;
        MyEntry(String key, Integer, Value) {
             this.key = key;
             this.value = value;
        }
    }
    Then just sort the list using the value part of the entry. By doing it this way, you lose the ability to access an entry based on the horse name.

    Regards,
    Jim
    The Java™ Tutorial | SSCCE | Java Naming Conventions
    Poor planning our your part does not constitute an emergency on my part.

  10. #10
    chiba is offline Member
    Join Date
    May 2013
    Posts
    6
    Rep Power
    0

    Default Re: Arrays vs HashMaps vs TreeSets - best method for sorting ability

    I used an object to solve it

    Java Code:
    import java.io.File;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Scanner;
    
    
    class Horse implements Comparator<Horse>, Comparable<Horse>{
       private String name;
       private int amount;
       private int bets;
       Horse(){
       }
    
       Horse(String n, int a, int b){
          name = n;
          amount = a;
          bets=b;
       }
    
       public String getHorseName(){
          return name;
       }
    
       public int getHorseAmount(){
          return amount;
       }
       public int getBets(){
    	      return bets;
       }
       public void setHorseAmount(int a){
    	      amount=a;
       }
       public void increment(){
    	      bets++;
       }
    
       // Overriding the compareTo method
       public int compareTo(Horse d){
          return (this.name).compareTo(d.name);
       }
    
       // Overriding the compare method to sort the age 
       public int compare(Horse h, Horse h1){
          //return h.amount - h1.amount;
    	   return h1.bets - h.bets;
       }
    }
    
    
    public class race {
    	public static void main(String args[]){
    	      // Takes a list of Horse objects
    	      List<Horse> list = new ArrayList<Horse>();
    
    	      File file = new File("horses.tsv");
    	   	  boolean hexists;
    	      int amount;
    	      int temp_a;
    	      String temp_s;
    	      String horse;
    	      String[] parts;
    	      
    			try
    			{
    				Scanner scanner = new Scanner(file);
    				String line = scanner.nextLine();
    				
    				while (line != null)
    				{
    					hexists =false;
    			        
    			        parts = line.split("\t");
    			        horse=parts[0];
    			        amount=Integer.parseInt(parts[1]);
    			        
    				    for(Horse a: list)
    				    {
    				    	temp_s=a.getHorseName();
    					       if(temp_s.equals(horse))
    					       {
    					    	   hexists =true;
    					    	   temp_a=a.getHorseAmount();
    					    	   amount=amount+temp_a;
    					    	   a.setHorseAmount(amount);
    					    	   a.increment();
    					    	   break;
    					       }
    				    }
    			        
    			    
    			        if (!hexists)
    			        {
    			        	list.add(new Horse(horse,amount,1));
    			        }
    			        line = scanner.nextLine();
    				}
    				
    			}
    			catch (Exception e) 
    			{
    			    //System.out.println(e);
    			    
    			}
    	      
    	      Collections.sort(list, new Horse());
    	      System.out.println();
    	      
    	      for(Horse a: list)
    	         System.out.println(a.getHorseName() +",  £ "+
    			 a.getHorseAmount() + ", number of bets " + a.getBets());
    	   }
    }
    Java Code:
    Senor El Betrutti,  £ 25190, number of bets 53
    Stalbridge Colonist,  £ 26620, number of bets 51
    Afleet Alex,  £ 24870, number of bets 49
    Assault,  £ 20290, number of bets 48
    Alydar,  £ 22920, number of bets 48
    Poliantas,  £ 25130, number of bets 48
    Rough Quest,  £ 20880, number of bets 47
    Barton Bank,  £ 23660, number of bets 47
    Dawn Run,  £ 26500, number of bets 46
    Bobbyjo,  £ 25190, number of bets 45
    Pridwell,  £ 20190, number of bets 44
    Voy Por Ustedes,  £ 22760, number of bets 43
    Master Oats,  £ 22620, number of bets 42
    Lord Gyllene,  £ 19360, number of bets 42
    General Wolfe,  £ 17820, number of bets 41
    The Grey Monk,  £ 23120, number of bets 41
    Norton's Coin,  £ 22460, number of bets 41
    Young Kenny,  £ 20610, number of bets 39
    Wayward Lad,  £ 23290, number of bets 38
    Lady Rebecca,  £ 18780, number of bets 38
    Uncle Ernie,  £ 15270, number of bets 38
    Affirmed,  £ 17730, number of bets 37
    Cab On Target,  £ 15320, number of bets 34

Similar Threads

  1. Arrays and HashMaps
    By kiloran in forum New To Java
    Replies: 4
    Last Post: 01-06-2013, 02:51 PM
  2. Replies: 8
    Last Post: 11-03-2011, 08:12 AM
  3. Sorting arrays
    By Lex in forum New To Java
    Replies: 4
    Last Post: 08-09-2011, 02:19 AM
  4. Arrays.sort... why sorting all arrays in class?
    By innspiron in forum New To Java
    Replies: 6
    Last Post: 03-23-2010, 01:40 AM
  5. Sorting Two Arrays
    By Faye Rett in forum New To Java
    Replies: 4
    Last Post: 03-07-2010, 01:00 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •