ฉันต้องการแปลง a HashMap<String, Object>
เป็นอาร์เรย์ ใครช่วยแสดงวิธีการทำ
ฉันต้องการแปลง a HashMap<String, Object>
เป็นอาร์เรย์ ใครช่วยแสดงวิธีการทำ
คำตอบ:
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values
ควรสังเกตว่าลำดับของอาร์เรย์ทั้งสองอาจไม่เหมือนกันโปรดดูคำตอบ oxbow_lakes สำหรับแนวทางที่ดีกว่าในการวนซ้ำเมื่อจำเป็นต้องใช้คีย์ / ค่าคู่
Set
และค่าเป็น a Collection
. ในขณะที่พวกเขาถูกแปลงเป็นอาร์เรย์ในทางเทคนิค (และตอบคำถามของคุณ) แนวคิดของคู่คีย์ - ค่าหายไป - ซึ่งเป็นสาเหตุที่ทำให้เข้าใจผิด (และเป็นอันตราย) คำตอบ ....
หากคุณต้องการคีย์และค่าคุณสามารถทำได้ตลอดเวลาผ่านทางentrySet
:
hashMap.entrySet().toArray(); // returns a Map.Entry<K,V>[]
จากแต่ละรายการคุณสามารถ (แน่นอน) รับทั้งคีย์และค่าผ่านทางgetKey
และgetValue
วิธีการ
{key, value}[]
เมื่อเทียบกับkey[], value[]
หากคุณมีHashMap<String, SomeObject> hashMap
แล้ว:
hashMap.values().toArray();
จะส่งคืนObject[]
ไฟล์. หากคุณต้องการอาร์เรย์ประเภทแทนคุณSomeObject
สามารถใช้:
hashMap.values().toArray(new SomeObject[0]);
values()
แทนที่จะkeySet()
เป็นอาร์เรย์ของSomeObject
.
ในการรับประกันลำดับที่ถูกต้องสำหรับอาร์เรย์ของคีย์และค่าแต่ละรายการให้ใช้สิ่งนี้ (คำตอบอื่นใช้คำตอบแต่ละรายการ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++;
}
อีกทางเลือกหนึ่งของคำแนะนำ CrackerJacks หากคุณต้องการให้ HashMap รักษาคำสั่งซื้อคุณสามารถพิจารณาใช้ LinkedHashMap แทน เท่าที่ฉันทราบว่าฟังก์ชันการทำงานเหมือนกับ HashMap แต่เป็น FIFO ดังนั้นจึงรักษาลำดับการเพิ่มรายการ
ฉันใช้เกือบจะเหมือนกับ @kmccoy แต่แทนที่จะเป็นkeySet()
ฉันทำสิ่งนี้
hashMap.values().toArray(new MyObject[0]);
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]);
}
}
เพื่อรับในอาร์เรย์มิติเดียว
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++;
}
หากคุณใช้ 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);
คุณอาจลองทำเช่นนี้
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 เป็นประเภทผลตอบแทน คุณสามารถเปลี่ยนเป็นประเภทการคืนสินค้าที่คุณต้องการได้
@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;
}
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);