Java: comment convertir HashMap <String, Object> en tableau


116

J'ai besoin de convertir un HashMap<String, Object>en tableau; quelqu'un pourrait-il me montrer comment c'est fait?


4
vous voulez les clés, les valeurs ou les deux?
harto

Réponses:


191
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

Éditer

Il convient de noter que l'ordre des deux tableaux peut ne pas être le même, voir la réponse oxbow_lakes pour une meilleure approche pour l'itération lorsque la paire clé / valeurs est nécessaire.


9
En fait, ce code n'offre aucune garantie que hashMap.keySet (). ToArray () [0] sera la clé d'origine pour hashMap.values ​​(). ToArray () [0] de la Map d'origine. Donc c'est extrêmement dangereux
CrackerJack9

2
@ CrackerJack9 pouvez-vous expliquer?
Jake Wilson

12
Les clés ne correspondront pas à leurs valeurs sur les deux tableaux.
Landon Kuhn

5
@Jakobud landon9720 est correct ... l'ordre est psuedo-random, et il ne peut être garanti que la clé [0] correspondra à la valeur [0] après avoir converti les clés en a Setet les valeurs en a Collection. Bien qu'ils soient techniquement convertis en tableaux (et répondent à votre question), le concept de la paire clé-valeur a été perdu - c'est pourquoi il s'agit d'une réponse très trompeuse (et dangereuse) ....
CrackerJack9

Je peux attester du danger de cet extrait de code. Quand je l'ai écrit, mon terminal m'a tendu la main et m'a giflé. Extrêmement dangereux! Il faut se méfier!
artburkart

65

Si vous voulez les clés et les valeurs, vous pouvez toujours le faire via entrySet:

hashMap.entrySet().toArray(); // returns a Map.Entry<K,V>[]

À partir de chaque entrée, vous pouvez (bien sûr) obtenir à la fois la clé et la valeur via les méthodes getKeyetgetValue


@ CrackerJack9 Non, cela fonctionne. Contrairement à la solution acceptée, celle-ci maintient les paires clé-valeur. Vous obtenez {key, value}[]par opposition àkey[], value[]
Tobiq

51

Si vous avez HashMap<String, SomeObject> hashMapalors:

hashMap.values().toArray();

Reviendra un Object[]. Si à la place vous voulez un tableau du type SomeObject, vous pouvez utiliser:

hashMap.values().toArray(new SomeObject[0]);

3
Je pense que vous voulez dire values()au lieu de keySet()pour un tableau de SomeObject.
Paul Bellora

4
Vous pouvez également améliorer les performances en spécifiant la taille du tableau à l'avance au lieu d'utiliser 0. Voir l'exemple ici: stackoverflow.com/a/5061692/265877
Alex

@Alex "Dans les anciennes versions de Java, il était recommandé d'utiliser un tableau pré-dimensionné (...) Cependant, depuis les dernières mises à jour d'OpenJDK 6, cet appel était intrinsèque, rendant les performances de la version de tableau vide identiques et parfois même meilleures, par rapport à la version antérieure -sized. Le passage d'un tableau pré-dimensionné est également dangereux pour une collection simultanée ou synchronisée car une course de données est possible entre la taille et l'appel toArray, ce qui peut entraîner des valeurs nulles supplémentaires à la fin du tableau, si la collection a été réduite simultanément pendant l'opération." - intellij
Hambourg est agréable le

30

Pour garantir le bon ordre pour chaque tableau de clés et de valeurs, utilisez ceci (les autres réponses utilisent des individus Setqui n'offrent aucune garantie quant à l'ordre.

Map<String, Object> map = new HashMap<String, Object>();
String[] keys = new String[map.size()];
Object[] values = new Object[map.size()];
int index = 0;
for (Map.Entry<String, Object> mapEntry : map.entrySet()) {
    keys[index] = mapEntry.getKey();
    values[index] = mapEntry.getValue();
    index++;
}

parfait! nous obtenons à la fois la clé et la valeur, avec les types automatiques remplissant l'éclipse, longtemps à la recherche de cela, merci!
Aquarius Power

12

Une alternative à la suggestion CrackerJacks, si vous voulez que le HashMap maintienne l'ordre, vous pouvez envisager d'utiliser un LinkedHashMap à la place. Pour autant que je sache, sa fonctionnalité est identique à celle d'un HashMap, mais c'est FIFO donc il maintient l'ordre dans lequel les éléments ont été ajoutés.


7

J'ai utilisé presque la même chose que @kmccoy, mais au lieu d'un, keySet()j'ai fait ceci

hashMap.values().toArray(new MyObject[0]);

6
Map<String, String> map = new HashMap<String, String>();
map.put("key1", "value1");
map.put("key2", "value2");

Object[][] twoDarray = new Object[map.size()][2];

Object[] keys = map.keySet().toArray();
Object[] values = map.values().toArray();

for (int row = 0; row < twoDarray.length; row++) {
    twoDarray[row][0] = keys[row];
    twoDarray[row][1] = values[row];
}

// Print out the new 2D array
for (int i = 0; i < twoDarray.length; i++) {
    for (int j = 0; j < twoDarray[i].length; j++) {
        System.out.println(twoDarray[i][j]);
    }
}

3

Pour obtenir dans un tableau à une dimension.

    String[] arr1 = new String[hashmap.size()];
    String[] arr2 = new String[hashmap.size()];
    Set entries = hashmap.entrySet();
    Iterator entriesIterator = entries.iterator();

    int i = 0;
    while(entriesIterator.hasNext()){

        Map.Entry mapping = (Map.Entry) entriesIterator.next();

        arr1[i] = mapping.getKey().toString();
        arr2[i] = mapping.getValue().toString();

        i++;
    }


Pour entrer dans un tableau à deux dimensions.

   String[][] arr = new String[hashmap.size()][2];
   Set entries = hashmap.entrySet();
   Iterator entriesIterator = entries.iterator();

   int i = 0;
   while(entriesIterator.hasNext()){

    Map.Entry mapping = (Map.Entry) entriesIterator.next();

    arr[i][0] = mapping.getKey().toString();
    arr[i][1] = mapping.getValue().toString();

    i++;
}

2

Si vous utilisez Java 8+ et avez besoin d'une version 2 dimensions Array, peut-être pour les fournisseurs de données TestNG, vous pouvez essayer:

map.entrySet()
    .stream()
    .map(e -> new Object[]{e.getKey(), e.getValue()})
    .toArray(Object[][]::new);

Si vos Objects sont des Strings et que vous en avez besoin String[][], essayez:

map.entrySet()
    .stream()
    .map(e -> new String[]{e.getKey(), e.getValue().toString()})
    .toArray(String[][]::new);

0

Vous pouvez aussi essayer ceci.

public static String[][] getArrayFromHash(Hashtable<String,String> data){
        String[][] str = null;
        {
            Object[] keys = data.keySet().toArray();
            Object[] values = data.values().toArray();
            str = new String[keys.length][values.length];
            for(int i=0;i<keys.length;i++) {
                str[0][i] = (String)keys[i];
                str[1][i] = (String)values[i];
            }
        }
        return str;
    }

Ici, j'utilise String comme type de retour. Vous pouvez le changer pour le type de retour requis par vous.


1
la question concerne HashMap()mais votre solution concerne Hashtable()... Il y a des différences entre eux
Choletski

0
@SuppressWarnings("unchecked")
    public static <E,T> E[] hashMapKeysToArray(HashMap<E,T> map)
    {
        int s;
        if(map == null || (s = map.size())<1)
            return null;

        E[] temp;
        E typeHelper;
        try
        {
            Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
            Entry<E, T> iK = iterator.next();
            typeHelper = iK.getKey();

            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (E[]) o;

            int index = 0;
            for (Map.Entry<E,T> mapEntry : map.entrySet())
            {
                temp[index++] = mapEntry.getKey();
            }
        }
        catch (Exception e)
        {
            return null;
        }
        return temp;
    }
//--------------------------------------------------------
    @SuppressWarnings("unchecked")
    public static <E,T> T[] hashMapValuesToArray(HashMap<E,T> map)
    {
        int s;
        if(map == null || (s = map.size())<1)
            return null;

        T[] temp;
        T typeHelper;
        try
        {
            Iterator<Entry<E, T>> iterator = map.entrySet().iterator();
            Entry<E, T> iK = iterator.next();
            typeHelper = iK.getValue();

            Object o = Array.newInstance(typeHelper.getClass(), s);
            temp = (T[]) o;

            int index = 0;
            for (Map.Entry<E,T> mapEntry : map.entrySet())
            {
                temp[index++] = mapEntry.getValue();
            }
        }
        catch (Exception e)
        {return null;}

        return temp;
    }

0
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.