Câu trả lời:
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values
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.
Set
và 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) ....
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 và giá trị thông qua getKey
và getValue
phương thức
{key, value}[]
trái ngược vớikey[], value[]
Nếu bạn có HashMap<String, SomeObject> hashMap
thì:
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]);
values()
thay vì keySet()
cho một mảng SomeObject
.
Để đả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 Set
s 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++;
}
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.
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]);
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]);
}
}
Để 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++;
}
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 Object
là String
s 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);
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.
@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);