web-dev-qa-db-fra.com

Récupérer toutes les valeurs des clés HashMap dans un Java ArrayList

Bonjour, cela me confond un peu (gel du cerveau!) Et il me manque quelque chose. Avoir un ArrayList que je remplis avec un HashMap. Maintenant, je mets dans mon HashMap et arraylist.

 Map.put(DATE, value1);
 Map.put(VALUE, value2);

 arraylist.put(Map);

Depuis que j'analyse un JSON, la taille de l'arraylist augmente. Ma question est la suivante: comment obtenez-vous les valeurs des deux clés de la carte dans la liste? j'ai essayé ça

  if(!list.isEmpty()){   // list is an ArrayList

            for(int k = 0; k < list.size(); k++){
                map = (HashMap)list.get(k);
            }

        }

        Log.d(TAG, "map size is" + map.size());

        String [] keys = new String[map.size()];
        String [] date_value = new String[map.size()];

        String [] value_values = new String[map.size()];

        int i = 0;
        Set entries = map.entrySet();
        Iterator iterator = entries.iterator();

        while(iterator.hasNext()){

            Map.Entry mapping = (Map.Entry)iterator.next();
            keys[i] = mapping.getKey().toString(); 
            date_value[i] = map.get(keys[i]);

            if(keys[i].equals(DATE)){
                date_value[i] = map.get(keys[i]);

            } else if(keys[i].equals(VALUE)){
                value_values[i] = map.get(keys[i]);
            }

                   i++;
                 }

Mais je n'arrive pas à obtenir toutes les valeurs. la taille de la carte renvoie toujours une valeur de 2, qui ne comprend que les éléments. Comment puis-je obtenir toutes les valeurs des touches Map dans ArrayList? Merci 

27
irobotxxx

Pourquoi voulez-vous réinventer la roue, alors que vous avez déjà quelque chose à faire votre travail. La méthode Map.keySet() vous donne un ensemble de toutes les clés de la carte.

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

for (String key: map.keySet()) {
    System.out.println("key : " + key);
    System.out.println("value : " + map.get(key));
}

De plus, votre première boucle semble étrange pour moi: -

   for(int k = 0; k < list.size(); k++){
            map = (HashMap)list.get(k);
   }

Vous parcourez votre liste et assignez chaque élément au même reference - map, ce qui écrasera toutes les valeurs précédentes. Tout ce que vous aurez, c'est la dernière carte de votre liste.

MODIFIER: -

Vous pouvez également utiliser entrySet si vous voulez à la fois la clé et la valeur de votre carte. Ce serait mieux pour vous: -

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

    for(Entry<String, Integer> entry: map.entrySet()) {
        System.out.println(entry.getKey());
        System.out.println(entry.getValue());
    }

P.S. : - 
Votre code me semble confus. Je suggère de garder ce code de côté et de penser à votre design une fois de plus. Pour l'instant, en l'état actuel du code, il est très difficile de comprendre ce que l'on tente de faire.

72
Rohit Jain

Essayez de cette façon ...

J'envisage la HashMap avec clé et valeur de type String, HashMap<String,String>

HashMap<String,String> hmap = new HashMap<String,String>();

hmap.put("key1","Val1");
hmap.put("key2","Val2");

ArrayList<String> arList = new ArrayList<String>();

for(Map.Entry<String,String> map : hmap.entrySet()){

     arList.add(map.getValue());

}
11
Kumar Vivek Mitra

Le constructeur de liste accepte toute structure de données qui implémente l'interface Collection à utiliser pour construire une liste

Pour obtenir toutes les touchesdepuis une carte de hachage vers une liste:

Map<String, Integer> map = new HashMap<String, Integer>();
List<String> keys = new ArrayList(map.keySet());

Pour obtenir toutes les valeurs d’une carte de hachage en une liste:

Map<String, Integer> map = new HashMap<String, Integer>();
List<Integer> values = new ArrayList(map.values());
3
Sivabalan

Mettez i ++ quelque part à la fin de votre boucle. 

Dans le code ci-dessus, la position 0 du tableau est écrasée car i n'est pas incrémenté dans chaque boucle.

FYI: le ci-dessous effectue une recherche redondante:

if(keys[i].equals(DATE)){                 
   date_value[i] = map.get(keys[i]);              
} else if(keys[i].equals(VALUE)){              
   value_values[i] = map.get(keys[i]);             
} 

remplacer par 

if(keys[i].equals(DATE)){                 
   date_value[i] = mapping.getValue();
} else if(keys[i].equals(VALUE)){              
   value_values[i] = mapping.getValue()
} 

Un autre problème est que vous utilisez i pour date_value et value_values. Ceci n'est valide que si vous avez l'intention d'avoir des valeurs NULL dans votre tableau.

1
John B

C'est incroyablement vieux, mais je suis tombé sur lui en essayant de trouver une réponse à une question différente.

ma question est: comment obtenez-vous les valeurs des deux clés de la carte dans la liste?

for (String key : map.keyset()) {
  list.add(key + "|" + map.get(key));
}

la taille de la carte retourne toujours une valeur de 2, qui ne comprend que les éléments

Je pense que vous pouvez être dérouté par les fonctionnalités de HashMap. HashMap autorise uniquement 1 à 1 relations dans la carte.

Par exemple si vous avez:

String TAG_FOO = "FOO";
String TAG_BAR = "BAR";

et essayez de faire quelque chose comme ça:

ArrayList<String> bars = ArrayList<>("bar","Bar","bAr","baR");
HashMap<String,String> map = new HashMap<>();
for (String bar : bars) {
  map.put(TAG_BAR, bar);
}

Ce code finira par définir l’entrée de clé "BAR" à associer au dernier élément de la liste bars.

Dans votre exemple, vous semblez confus qu'il n'y a que deux éléments, mais que vous n'en avez que deux clés enregistrées, ce qui me laisse penser que vous avez simplement écrasé le champ de chaque clé plusieurs fois.

1
nukeforum

Supposons que j'ai Hashmap avec le type de données key comme KeyDataType Et le type de données value comme ValueDataType

HashMap<KeyDataType,ValueDataType> list;

Ajoutez-y tous les éléments dont vous aviez besoin . Vous pouvez maintenant récupérer toutes les clés de hashmap dans une liste.

KeyDataType[] mKeys;
mKeys=list.keySet().toArray(new KeyDataType[list.size()]);

Donc, maintenant vous avez toutes vos clés dans un tableau mkeys []

vous pouvez maintenant récupérer n'importe quelle valeur en appelant

 list.get(mkeys[position]);
0
chandan

Solution Java 8 pour la chaîne de production telle que "clé1: valeur1, clé2: valeur2" 

private static String hashMapToString(HashMap<String, String> hashMap) {

    return hashMap.keySet().stream()
            .map((key) -> key + ": " + hashMap.get(key))
            .collect(Collectors.joining(","));

}

et produire une liste simple recueillir en tant que liste

private static List<String> hashMapToList(HashMap<String, String> hashMap) {

    return hashMap.keySet().stream()
            .map((key) -> key + ": " + hashMap.get(key))
            .collect(Collectors.toList());

}
0
Ali Katkar