Java: วิธีแปลง HashMap <String, Object> เป็น array


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] จะเป็นคีย์ดั้งเดิมสำหรับ hashMap.values ​​(). toArray () [0] จากแผนที่ดั้งเดิม ดังนั้นนี่จึงเป็นอันตราย
CrackerJack9

2
@ CrackerJack9 ช่วยอธิบายหน่อย
Jake Wilson

12
คีย์จะไม่สอดคล้องกับค่าของทั้งสองอาร์เรย์
Landon Kuhn

5
@Jakobud landon9720 ถูกต้อง ... ลำดับเป็นแบบสุ่ม psuedo และไม่สามารถรับประกันได้ว่าคีย์ [0] จะตรงกับค่า [0] หลังจากที่คุณแปลงคีย์เป็น a Setและค่าเป็น a Collection. ในขณะที่พวกเขาถูกแปลงเป็นอาร์เรย์ในทางเทคนิค (และตอบคำถามของคุณ) แนวคิดของคู่คีย์ - ค่าหายไป - ซึ่งเป็นสาเหตุที่ทำให้เข้าใจผิด (และเป็นอันตราย) คำตอบ ....
CrackerJack9

ฉันสามารถยืนยันได้ถึงอันตรายจากข้อมูลโค้ดนี้ เมื่อฉันเขียนมันเทอร์มินัลของฉันก็เอื้อมมือมาตบฉัน อันตรายอย่างยิ่ง! ระวัง!
artburkart

65

หากคุณต้องการคีย์และค่าคุณสามารถทำได้ตลอดเวลาผ่านทางentrySet:

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

จากแต่ละรายการคุณสามารถ (แน่นอน) รับทั้งคีย์และค่าผ่านทางgetKeyและgetValueวิธีการ


@ 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

4
คุณยังสามารถปรับปรุงประสิทธิภาพโดยการระบุขนาดอาร์เรย์ล่วงหน้าแทนที่จะใช้ 0 ดูตัวอย่างที่นี่: stackoverflow.com/a/5061692/265877
Alex

@Alex "ในเวอร์ชัน Java ที่เก่ากว่าที่ใช้อาร์เรย์ขนาดล่วงหน้าได้รับการแนะนำ (... ) อย่างไรก็ตามตั้งแต่การอัปเดตช่วงปลายของ OpenJDK 6 การเรียกนี้ได้รับการระบุไว้ในตัวทำให้ประสิทธิภาพของอาร์เรย์ว่างรุ่นเดียวกันและบางครั้งก็ดีขึ้นกว่าเดิมเมื่อเทียบกับรุ่นก่อน รุ่นขนาดนอกจากนี้การส่งอาร์เรย์ขนาดล่วงหน้ายังเป็นอันตรายสำหรับการรวบรวมพร้อมกันหรือซิงโครไนซ์เนื่องจากการแข่งขันข้อมูลเป็นไปได้ระหว่างขนาดและการเรียก toArray ซึ่งอาจส่งผลให้มีค่าว่างเพิ่มเติมที่ส่วนท้ายของอาร์เรย์หากคอลเล็กชันหดพร้อมกันในระหว่าง การดำเนินการ” - 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

เพื่อรับในอาร์เรย์มิติเดียว

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


เพื่อรับในอาร์เรย์สองมิติ

   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+ และต้องการ 2 มิติArrayสำหรับผู้ให้บริการข้อมูล TestNG คุณสามารถลอง:

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

หากคุณObjectเป็นStringของคุณและคุณต้องการ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;
    }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.