43

I have a hashmap of the following type

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

The values stored are like this :

mango | 0,4,8,9,12 apple | 2,3 grapes| 1,7 peach | 5,6,11 

I want to store as well as fetch those Integers using Iterator or any other way with minimum lines of code.How can I do it?

EDIT 1

The numbers are added at random (not together) as key is matched to the appropriate line.

EDIT 2

How can I point to the arraylist while adding ?

I am getting error while adding a new number 18 in the line map.put(string,number);

0

9 Answers 9

60

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. } 
Sign up to request clarification or add additional context in comments.

2 Comments

:What does ee.getValue() return ?An ArrayList I suppose.So i need a temporary arralist I suppose.Is that so?
@InsaneCoder Yes, it returns an ArrayList (of Integers). Whether or not you need a temporary ArrayList or not depends on what you want to do with it. You can call ee.getValue multiple times and still get the same ArrayList.
4

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 */ } } 

Comments

2
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); } 

Comments

2

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 

Comments

1

You could try using MultiMap instead of HashMap

Initialising it will require fewer lines of codes. Adding and retrieving the values will also make it shorter.

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

would become:

Multimap<String, Integer> multiMap = ArrayListMultimap.create(); 

You can check this link: http://java.dzone.com/articles/hashmap-%E2%80%93-single-key-and

Comments

1

Method1 : Use putIfAbsent

 Map<String, List<Integer>> map = new HashMap(); map.putIfAbsent("mango",new ArrayList<>()); map.get("mango").add(5); 

Method 2: Check key present in Map

 Map<String, List<Integer>> map = new HashMap(); if(! map.containsKey("mango"){ map.put("mango",new ArrayList<>()); } List<Integer> list = map.get("mango"); list.add(3); 

Method 3: Use getOrDefault

 Map<String, List<Integer>> map = new HashMap(); List<Integer> list = map.getOrDefault("mango",new ArrayList<>()); list.add(4) 

Comments

0
for (Map.Entry<String, ArrayList<Integer>> entry : map.entrySet()) { System.out.println( entry.getKey()); System.out.println( entry.getValue());//Returns the list of values } 

Comments

0
static HashMap<Integer, ArrayList<Integer>> has(int arr[], int target) { HashMap<Integer, ArrayList<Integer>> hm = new HashMap<Integer, ArrayList<Integer>>(); for (int i = 0; i < arr.length; i++) { if (!hm.containsKey(arr[i])) { ArrayList<Integer> res = new ArrayList<Integer>(); res.add(i + 1); hm.put(arr[i], res); } else { hm.get(arr[i]).add(i); } } return hm; } 

Comments

-1

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); } 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.