Java: cách chuyển đổi HashMap <String, Object> thành mảng


116

Tôi cần chuyển đổi một HashMap<String, Object>mảng thành một mảng; bất cứ ai có thể chỉ cho tôi làm thế nào nó được thực hiện?


4
Bạn muốn các khóa, các giá trị, hoặc cả hai?
harto

Câu trả lời:


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

Biên tập

Cần lưu ý rằng thứ tự của cả hai mảng có thể không giống nhau, Xem câu trả lời oxbow_lakes để có cách tiếp cận tốt hơn cho phép lặp khi cần khóa / giá trị cặp.


9
Trên thực tế, mã này không đảm bảo rằng hashMap.keySet (). ToArray () [0] sẽ là khóa gốc cho hashMap.values ​​(). ToArray () [0] từ Bản đồ gốc. Vì vậy, điều này cực kỳ nguy hiểm
CrackerJack9

2
@ CrackerJack9 bạn có thể giải thích?
Jake Wilson

12
Các khóa sẽ không tương ứng với các giá trị của chúng trên hai mảng.
Landon Kuhn

5
@Jakobud Landon9720 là chính xác ... thứ tự là psuedo-ngẫu nhiên và không thể đảm bảo rằng khóa [0] sẽ tương ứng với giá trị [0] sau khi bạn chuyển đổi các khóa thành a Setvà các giá trị thành a Collection. Mặc dù chúng được chuyển đổi kỹ thuật thành mảng (và trả lời câu hỏi của bạn), khái niệm về cặp giá trị khóa đã bị mất - đó là lý do tại sao đây là câu trả lời rất sai (và nguy hiểm) ....
CrackerJack9

Tôi có thể chứng thực sự nguy hiểm của đoạn mã này. Khi tôi viết nó, thiết bị đầu cuối của tôi vươn ra và tát tôi. Cực kỳ nguy hiểm! Coi chừng!
artburkart

65

Nếu bạn muốn các khóa và giá trị, bạn luôn có thể thực hiện việc này thông qua entrySet:

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

Từ mỗi mục, bạn có thể (tất nhiên) có được cả khóa giá trị thông qua getKeygetValuephương thức


@ CrackerJack9 Không, nó hoạt động. Không giống như giải pháp được chấp nhận, giải pháp này duy trì các cặp khóa-giá trị. Bạn nhận được {key, value}[]trái ngược vớikey[], value[]
Tobiq

51

Nếu bạn có HashMap<String, SomeObject> hashMapthì:

hashMap.values().toArray();

Sẽ trả lại một Object[]. Nếu thay vào đó bạn muốn một mảng kiểu SomeObject, bạn có thể sử dụng:

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

3
Tôi nghĩ bạn có nghĩa là values()thay vì keySet()cho một mảng SomeObject.
Paul Bellora

4
Bạn cũng có thể cải thiện hiệu suất bằng cách chỉ định kích thước mảng phía trước thay vì sử dụng 0. Xem ví dụ tại đây: stackoverflow.com/a/5061692/265877
Alex

@Alex "Trong các phiên bản Java cũ hơn sử dụng mảng có kích thước trước được khuyến nghị (...) Tuy nhiên, do các bản cập nhật muộn của OpenJDK 6, cuộc gọi này đã được thực hiện, làm cho hiệu suất của phiên bản mảng trống giống nhau và đôi khi còn tốt hơn so với trước Phiên bản kích thước. Ngoài ra, việc truyền mảng có kích thước sẵn rất nguy hiểm cho bộ sưu tập đồng thời hoặc được đồng bộ hóa vì cuộc đua dữ liệu có thể xảy ra giữa cuộc gọi kích thước và cuộc gọi toArray có thể dẫn đến vô hiệu ở cuối mảng, nếu bộ sưu tập bị thu hẹp đồng thời trong khi thu thập đồng thời hoạt động. " - intellij
Hamburg rất đẹp vào

30

Để đảm bảo thứ tự chính xác cho từng mảng Khóa và Giá trị, hãy sử dụng giá trị này (các câu trả lời khác sử dụng các Sets riêng lẻ không đảm bảo đặt hàng.

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

hoàn hảo! chúng tôi nhận được cả khóa và giá trị, với các loại tự động điền vào nhật thực, thời gian dài tìm kiếm này, thx!
Sức mạnh Bảo Bình

12

Một thay thế cho đề xuất của CrackerJacks, nếu bạn muốn HashMap duy trì trật tự, bạn có thể cân nhắc sử dụng LinkedHashMap thay thế. Theo như tôi biết thì chức năng của nó giống hệt với HashMap nhưng nó là FIFO nên nó duy trì thứ tự các mục được thêm vào.


7

Tôi đã sử dụng gần giống như @kmccoy, nhưng thay vì keySet()tôi đã làm điều này

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

Để có được trong một mảng kích thước.

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


Để có được trong hai mảng kích thước.

   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

Nếu bạn đang sử dụng Java 8+ và cần 2 chiều Array, có lẽ đối với các nhà cung cấp dữ liệu TestNG, bạn có thể thử:

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

Nếu bạn ObjectStrings và bạn cần a String[][], hãy thử:

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

0

Bạn cũng có thể thử điều này.

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

Ở đây tôi đang sử dụng String làm kiểu trả về. Bạn có thể thay đổi nó thành loại trả lại yêu cầu của bạn.


1
câu hỏi là về HashMap()nhưng giải pháp của bạn là về Hashtable()... Có một số khác biệt giữa chúng
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);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.