Java: como converter HashMap <String, Object> em array


Respostas:


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

Editar

Deve-se observar que a ordem de ambas as matrizes pode não ser a mesma. Consulte a resposta oxbow_lakes para obter uma abordagem melhor para iteração quando o par chave / valores são necessários.


9
Na verdade, este código não oferece nenhuma garantia de que hashMap.keySet (). ToArray () [0] será a chave original para hashMap.values ​​(). ToArray () [0] do Mapa original. Portanto, isso é extremamente perigoso
CrackerJack9

2
@ CrackerJack9 você pode explicar?
Jake Wilson

12
As chaves não correspondem aos seus valores nas duas matrizes.
Landon Kuhn

5
@Jakobud landon9720 está correto ... a ordem é psuedo-aleatória e não pode ser garantido que a chave [0] corresponderá ao valor [0] depois de converter as chaves para a Sete os valores para a Collection. Embora eles sejam tecnicamente convertidos em matrizes (e respondam à sua pergunta), o conceito do par de valores-chave foi perdido - razão pela qual esta é uma resposta muito enganosa (e perigosa) ....
CrackerJack9

Posso atestar o perigo desse trecho de código. Quando eu escrevi, meu terminal estendeu a mão e me deu um tapa. Extremamente perigoso! Cuidado!
artburkart

65

Se quiser as chaves e os valores, você sempre pode fazer isso por meio de entrySet:

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

De cada entrada, você pode (é claro) obter a chave e o valor por meio dos métodos getKeyegetValue


@ CrackerJack9 Não, funciona. Ao contrário da solução aceita, esta mantém os pares de valores-chave. Você obtém {key, value}[]o oposto dekey[], value[]
Tobiq

51

Se você tem HashMap<String, SomeObject> hashMapentão:

hashMap.values().toArray();

Retornará um Object[]. Se, em vez disso, você quiser uma matriz do tipo SomeObject, poderá usar:

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

3
Eu acho que você quer dizer em values()vez de keySet()uma matriz de SomeObject.
Paul Bellora

4
Você também pode melhorar o desempenho especificando o tamanho da matriz antecipadamente em vez de usar 0. Veja o exemplo aqui: stackoverflow.com/a/5061692/265877
Alex

@Alex "Em versões mais antigas do Java, o uso de array pré-dimensionado era recomendado (...) No entanto, desde as últimas atualizações do OpenJDK 6, essa chamada foi intrinsecada, tornando o desempenho da versão do array vazio o mesmo e às vezes até melhor, em comparação com o anterior -sized version. Também passar a matriz pré-dimensionada é perigoso para uma coleção simultânea ou sincronizada, pois uma disputa de dados é possível entre o tamanho e a chamada toArray, que pode resultar em nulos extras no final da matriz, se a coleção foi simultaneamente reduzida durante a operação." - intellij
Hamburgo é bom

30

Para garantir a ordem correta para cada array de Chaves e Valores, use isto (as outras respostas usam Sets individuais que não oferecem garantia quanto ao pedido.

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

perfeito! obtemos chave e valor, com tipos de automóveis preenchendo eclipse, muito tempo procurando por isso, obrigado!
Aquarius Power

12

Uma alternativa à sugestão do CrackerJacks, se você quiser que o HashMap mantenha a ordem, você pode considerar o uso de um LinkedHashMap. Até onde eu sei, sua funcionalidade é idêntica a um HashMap, mas é FIFO, então mantém a ordem em que os itens foram adicionados.


7

Usei quase o mesmo que @kmccoy, mas em vez de usei keySet()isso

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

Para entrar em uma matriz de dimensão.

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


Para entrar na matriz de duas dimensões.

   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

Se você estiver usando Java 8+ e precisar de um bidimensional Array, talvez para provedores de dados TestNG, você pode tentar:

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

Se seus Objects são se Stringvocê precisa de um String[][], tente:

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

0

Você também pode tentar isso.

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

Aqui estou usando String como tipo de retorno. Você pode alterá-lo para o tipo de retorno exigido por você.


1
a questão é sobre, HashMap()mas sua solução é sobre Hashtable()... Existem algumas diferenças entre eles
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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.