Storing and Retrieving ArrayList values from hashmap

后端 未结 7 2504
感动是毒
感动是毒 2020-12-13 13:27

I have a hashmap of the following type

HashMap> map=new HashMap>();    
<         


        
相关标签:
7条回答
  • 2020-12-13 13:34

    Our variable:

    Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();
    

    To store:

    map.put("mango", new ArrayList<Integer>(Arrays.asList(0, 4, 8, 9, 12)));
    

    To add numbers one and one, you can do something like this:

    String key = "mango";
    int number = 42;
    if (map.get(key) == null) {
        map.put(key, new ArrayList<Integer>());
    }
    map.get(key).add(number);
    

    In Java 8 you can use putIfAbsent to add the list if it did not exist already:

    map.putIfAbsent(key, new ArrayList<Integer>());
    map.get(key).add(number);
    

    Use the map.entrySet() method to iterate on:

    for (Entry<String, List<Integer>> ee : map.entrySet()) {
        String key = ee.getKey();
        List<Integer> values = ee.getValue();
        // TODO: Do something.
    }
    
    0 讨论(0)
  • 2020-12-13 13:43
    Iterator it = map.entrySet().iterator();
    while (it.hasNext()) {
         Map.Entry pairs = (Map.Entry)it.next();
    
         if(pairs.getKey().equals("mango"))
         {
            map.put(pairs.getKey(), pairs.getValue().add(18));
         }
    
         else if(!map.containsKey("mango"))
         {
            List<Integer> ints = new ArrayList<Integer>();
            ints.add(18);
            map.put("mango",ints);
         }
    
         it.remove(); // avoids a ConcurrentModificationException
    }
    

    EDIT: So inside the while try this:

    map.put(pairs.getKey(), pairs.getValue().add(number))
    

    You are getting the error because you are trying to put an integer to the values, whereas it is expected an ArrayList.

    EDIT 2: Then put the following inside your while loop:

    if(pairs.getKey().equals("mango"))
    {
        map.put(pairs.getKey(), pairs.getValue().add(18));
    }
    
    else if(!map.containsKey("mango"))
    {
         List<Integer> ints = new ArrayList<Integer>();
         ints.add(18);
         map.put("mango",ints);
     }
    

    EDIT 3: By reading your requirements, I come to think you may not need a loop. You may want to only check if the map contains the key mango, and if it does add 18, else create a new entry in the map with key mango and value 18.

    So all you may need is the following, without the loop:

    if(map.containsKey("mango"))
    {
        map.put("mango", map.get("mango).add(18));
    }
    
    else
    {
        List<Integer> ints = new ArrayList<Integer>();
        ints.add(18);
        map.put("mango", ints);
    }
    
    0 讨论(0)
  • 2020-12-13 13:44
    for (Map.Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
     System.out.println( entry.getKey());     
     System.out.println( entry.getValue());//Returns the list of values
    }
    
    0 讨论(0)
  • 2020-12-13 13:46

    Fetch all at once =

    List<Integer> list = null;
    
    if(map!= null) 
    { 
      list = new ArrayList<Integer>(map.values()); 
    }
    

    For Storing =

    if(map!= null) 
    { 
      list = map.get(keyString); 
       if(list == null)
        {
             list = new ArrayList<Integer>();
        }
      list.add(value);
      map.put(keyString,list);
    }
    
    0 讨论(0)
  • 2020-12-13 13:51

    You can use like this(Though the random number generator logic is not upto the mark)

    public class WorkSheet {
        HashMap<String,ArrayList<Integer>> map = new HashMap<String,ArrayList<Integer>>();
    
    public static void main(String args[]) {
        WorkSheet test = new WorkSheet();
        test.inputData("mango", 5);
        test.inputData("apple", 2);
        test.inputData("grapes", 2);
        test.inputData("peach", 3);
        test.displayData();
    
    }
    public void displayData(){
        for (Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
            System.out.print(entry.getKey()+" | ");
            for(int fruitNo : entry.getValue()){
                System.out.print(fruitNo+" ");
            }
            System.out.println();
        }
    }
    public void inputData(String name ,int number) {
        Random rndData = new Random();
        ArrayList<Integer> fruit = new ArrayList<Integer>();
        for(int i=0 ; i<number ; i++){
            fruit.add(rndData.nextInt(10));
        }
        map.put(name, fruit);
    }
    }
    

    OUTPUT

    grapes | 7 5 
    apple | 9 5 
    peach | 5 5 8 
    mango | 4 7 1 5 5 
    
    0 讨论(0)
  • 2020-12-13 13:55

    The modern way (as of 2020) to add entries to a multimap (a map of lists) in Java is:

    map.computeIfAbsent("apple", k -> new ArrayList<>()).add(2);
    map.computeIfAbsent("apple", k -> new ArrayList<>()).add(3);
    

    According to Map.computeIfAbsent docs:

    If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null.

    Returns: the current (existing or computed) value associated with the specified key, or null if the computed value is null

    The most idiomatic way to iterate a map of lists is using Map.forEach and Iterable.forEach:

    map.forEach((k, l) -> l.forEach(v -> /* use k and v here */));
    

    Or, as shown in other answers, a traditional for loop:

    for (Map.Entry<String, List<Integer>> e : map.entrySet()) {
        String k = e.getKey();
        for (Integer v : e.getValue()) {
            /* use k and v here */
        }
    }
    
    0 讨论(0)
提交回复
热议问题