Java:HashMap <String、Object>を配列に変換する方法


116

HashMap<String, Object>配列に変換する必要があります。誰がそれがどのように行われるかを私に示すことができますか?


4
キー、値、またはその両方が必要ですか?
harto 2009

回答:


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

編集する

両方の配列の順序が同じでない場合があることに注意してください。キーと値のペアが必要な場合の反復のより良いアプローチについては、oxbow_lakesの回答を参照してください。


9
実際、このコードは、hashMap.keySet()。toArray()[0]が元のMapのhashMap.values()。toArray()[0]の元のキーになることを保証しません。したがって、これは非常に危険です
CrackerJack9 '07 / 08/18

2
@ CrackerJack9説明できますか?
ジェイクウィルソン

12
キーは、2つの配列全体の値に対応しません。
Landon Kuhn

5
@Jakobud landon9720は正しい...順序は疑似ランダムであり、キーをa Setに、値をaに変換した後、key [0]がvalue [0]に対応することは保証できませんCollection。彼らは技術的に配列に変換(およびあなたの質問に答える)している間、キーと値のペアの概念が失われている-これは非常に誤解を招く(危険)の答えである理由である....
CrackerJack9

このコードスニペットの危険性を証明できます。私がそれを書いたとき、私のターミナルは私に手を差し伸べて、私を叩きました。非常に危険です!注意してください!
artburkart

65

キーと値が必要な場合は、いつでもこれを行うことができますentrySet

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

各エントリから(もちろん)およびメソッドを介してキー値の両方を取得できますgetKeygetValue


@ CrackerJack9いいえ、機能します。受け入れられているソリューションとは異なり、これはキーと値のペアを維持します。あなた{key, value}[]は反対になるkey[], value[]
-Tobiq

51

あなたがしているHashMap<String, SomeObject> hashMap場合:

hashMap.values().toArray();

を返しますObject[]。代わりにのタイプの配列がSomeObject必要な場合は、次を使用できます。

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

3
の配列ではvalues()なく、という意味だと思います。keySet()SomeObject
ポールベロラ

4
また、0を使用する代わりに配列サイズ
Alex

@Alex "以前のサイズの配列を使用する古いJavaバージョンが推奨されていました(...)ただし、OpenJDK 6の最新のアップデート以降、この呼び出しが組み込まれ、空の配列バージョンのパフォーマンスが以前のバージョンと同じ、場合によってはさらに向上しました。サイズのバージョン。また、コレクションが同時に縮小された場合、サイズとtoArray呼び出しの間でデータ競合が発生し、配列の最後に余分なnullが発生する可能性があるため、プリサイズの配列を渡すことは、同時または同期コレクションでは危険です。操作。" -intellij
ハンブルクは素晴らしいです

30

キーと値の各配列の正しい順序を保証するには、これを使用します(他の回答はSet、順序に関して保証のない個々のを使用します。

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

完璧!キーと値の両方を取得します。自動タイプはEclipseに入力されます。これを長い間探しています。
Aquarius Power

12

CrackerJacks提案の代わりに、HashMapで順序を維持したい場合は、代わりにLinkedHashMapの使用を検討できます。私の知る限り、その機能はHashMapと同じですが、FIFOであるため、アイテムが追加された順序が維持されます。


7

私は@kmccoyとほとんど同じを使用しましたが、代わりにこれkeySet()を行いました

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

1次元配列を取得するには。

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


2次元配列を取得します。

   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

Java 8+を使用していてArray、おそらくTestNGデータプロバイダー用に2次元が必要な場合は、次のことを試してください。

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

お使いの場合ObjectsはString、sは、あなたが必要とするString[][]、試してみてください。

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

0

これも試してみてください。

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

ここでは、戻り値の型としてStringを使用しています。必要に応じて戻り値の型に変更できます。


1
問題は約ですHashMap()が、あなたの解決策は約Hashtable()です... それらの間にはいくつかの違いがあります
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);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.