자바 : HashMap <String, Object>를 배열로 변환하는 방법


116

a HashMap<String, Object>를 배열 로 변환해야합니다 . 누구든지 그것이 어떻게 끝났는지 보여줄 수 있습니까?


4
키, 값 또는 둘 다를 원하십니까?
harto

답변:


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

2
@ CrackerJack9 설명 할 수 있습니까?
Jake Wilson

12
키는 두 배열의 값과 일치하지 않습니다.
Landon Kuhn 2011

5
@Jakobud landon9720는 순서가 사이비 랜덤입니다 ... 올바른이며, 그것은 당신이 열쇠로 변환 한 후 키 [0] [0] 값에 해당하는 것을 보장 할 수 없습니다 SetA를하고 값을 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.
Paul Bellora 2012

4
0을 사용하는 대신 어레이 크기를 미리 지정하여 성능을 향상시킬 수도 있습니다. 여기 예를 참조하십시오. stackoverflow.com/a/5061692/265877
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++;
}

완전한! 우리는 키와 값을 모두 얻습니다. 자동 유형은 이클립스를 채우고 오랫동안 이것을 찾고 있습니다.
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 이상을 사용 중이고 ArrayTestNG 데이터 공급자에 대해 2 차원이 필요한 경우 다음을 시도해 볼 수 있습니다.

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

귀하의 경우 ObjectS는 StringS는 당신이 필요합니다 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.