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);
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.
}
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);
}
}
grapes | 7 5
Apple | 9 5
Peach | 5 5 8
mango | 4 7 1 5 5
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);
}
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
for (Map.Entry<String, ArrayList<Integer>> entry : map.entrySet()) {
System.out.println( entry.getKey());
System.out.println( entry.getValue());//Returns the list of values
}
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);
}