web-dev-qa-db-fra.com

Stockage et récupération des valeurs ArrayList à partir de hashmap

J'ai un hashmap du type suivant 

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

Les valeurs stockées sont comme ceci:

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

Je veux stocker et récupérer ces nombres entiers en utilisant Iterator ou tout autre moyen avec un minimum de lignes de code. Comment puis-je le faire?

EDIT 1

Les nombres sont ajoutés au hasard (pas ensemble) au fur et à mesure que la clé est associée à la ligne appropriée.

EDIT 2

Comment puis-je pointer vers l'arraylist tout en ajoutant? 

Je reçois une erreur en ajoutant un nouveau numéro 18 dans la ligne map.put(string,number);

24
Insane Coder

Notre variable:

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

Ranger:

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

Pour ajouter les numéros un et un, vous pouvez faire quelque chose comme ceci:

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

En Java 8, vous pouvez utiliser putIfAbsent pour ajouter la liste si elle n'existait pas déjà:

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

Utilisez la méthode map.entrySet() pour effectuer une itération sur:

for (Entry<String, List<Integer>> ee : map.entrySet()) {
    String key = ee.getKey();
    List<Integer> values = ee.getValue();
    // TODO: Do something.
}
33
Simon Forsberg

Vous pouvez utiliser comme ceci (bien que la logique du générateur de nombres aléatoires ne soit pas à la hauteur) 

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

SORTIE

grapes | 7 5 
Apple | 9 5 
Peach | 5 5 8 
mango | 4 7 1 5 5 
2
Prateek
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: Donc, à l’intérieur, essayez ceci:

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

Vous obtenez l'erreur parce que vous essayez de mettre un entier aux valeurs, alors qu'il est attendu que ArrayList

EDIT 2: Ensuite, insérez ce qui suit dans votre boucle while:

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: En lisant vos exigences, j'en viens à penser que vous n’avez peut-être pas besoin d’une boucle. Vous voudrez peut-être uniquement vérifier si la carte contient la clé mango et si elle ajoute 18, sinon créez une nouvelle entrée dans la carte avec la clé mango et la valeur 18.

Donc, tout ce dont vous avez besoin est la suivante, sans la boucle:

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

Vous pouvez essayer d'utiliser MultiMap au lieu de HashMap

L'initialisation nécessitera moins de lignes de codes. L'ajout et la récupération des valeurs le rendront également plus court.

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

deviendrait:

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

Vous pouvez vérifier ce lien: http://Java.dzone.com/articles/hashmap-%E2%80%93-single-key-and

0
juanpaolo
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
Masudul

Chercher tout à la fois =

List<Integer> list = null;

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

Pour stocker = 

if(map!= null) 
{ 
  list = map.get(keyString); 
   if(list == null)
    {
         list = new ArrayList<Integer>();
    }
  list.add(value);
  map.put(keyString,list);
}
0