Java: 如何将 HashMap < String,Object > 转换为 array

我需要将一个 HashMap<String, Object>转换成一个数组; 有人能告诉我怎么做吗?

343452 次浏览
hashMap.keySet().toArray(); // returns an array of keys
hashMap.values().toArray(); // returns an array of values

剪辑

应该注意的是,两个数组的顺序可能不相同, 如果需要成对键/值,请参阅 oxbow _ lake 提供的更好迭代方法。

如果你想要键和值,你可以通过 entrySet:

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

通过 getKeygetValue方法,您可以(当然)从每个条目中获得键 还有

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

如果你有 HashMap<String, SomeObject> hashMap,那么:

hashMap.values().toArray();

返回一个 Object[]。如果你想要一个类型为 SomeObject的数组,你可以使用:

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

为了保证每个键和值数组的正确顺序,使用以下命令(其他答案使用单个 Set,这些 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,但它是先进先出,所以它保持了项目添加的顺序。

你也可以试试这个。

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


进入二维数组。 < br >

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

我使用了几乎相同的@kmccoy,但代替 keySet()我这样做

hashMap.values().toArray(new MyObject[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;
}
HashMap<String, String> hashMap = new HashMap<>();
String[] stringValues= new String[hashMap.values().size()];
hashMap.values().toArray(stringValues);

如果您正在使用 Java8 + ,并且需要一个2维的 Array,或许对于 TestNG 数据提供程序,您可以尝试:

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

如果你的 ObjectString,你需要 String[][],试试:

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

如果需要向对象数组传递值,请尝试:

Array:
Object[] object= hashMap.values().toArray(new Object[0]);


Arraylist:
ArrayList<Object> object=new ArrayList<>(hashMap.values());

在这种情况下,键和值是字符串,并且希望在同一数组中交替键和值:

String[] result = myMap.entrySet()
.stream()
.flatMap(entry -> Stream.of(entry.getKey(),entry.getValue()))
.toArray(String[]::new);
// result = {key_1, value_1, key_2, value_2 ...}