How does one convert a HashMap to a List in Java?
在Java中,如何获得一个以0 - 1为单位的返回值?
- 这可能不应该是一个问题——或者你应该把它变成一个适当的问题,接受随之而来的第一个合理的答案?这使得很难找到真正需要回答的问题。
- 如果不需要返回列表,我认为将Collection或Set转换为ArrayList对我来说没有多大意义。只需返回从hashmap获得的集合或集合
- 重复:stackoverflow.com/questions/1026723/…
1 2 3 4 5 6 7
| HashMap <Integer, String > map = new HashMap <Integer, String >();
map. put (1, "Mark");
map. put (2, "Tarryn");
List <String > list = new ArrayList <String >(map. values());
for (String s : list ) {
System. out. println(s );
} |
- 基本上,hashmap类的.values()方法返回一组值。您也可以使用.keys()来解决这个问题。arraylist()类接受集合作为其构造函数之一。因此,可以从hashmap值集合创建新的arraylist。我不知道表演是什么样子的,但对我来说,简单是值得的!
- 如果您只想打印或获取对象,则不需要使用列表。
- 只是想澄清一下。
假设你有:
1
| HashMap <Key, Value > map ; // Assigned or populated somehow. |
对于值列表:
1
| List<Value> values = new ArrayList<Value>(map.values()); |
。
对于键列表:
1
| List<Key> keys = new ArrayList<Key>(map.keySet()); |
请注意,哈希映射的键和值的顺序不可靠;如果需要保留键和值在各自列表中位置的一对一对应关系,请使用LinkedHashMap。
- +1为注意正确订购,应使用LinkedHashMap<=>List。另外,使用HashMap<=>Set表示它是无序的,这可能是无序转换的良好实践。
- 由于其简单性,这似乎是一个比选择的答案更好的解决方案。
基本上,你不应该把问题和答案搞混了,因为答案很混乱。
然后您可以指定转换的含义并选择一个解决方案
号
- Map具有keySet()方法。使用它比您为keyList发布的更简单。
- @Joachim,这是我感谢的正确方法名。但是如果你想把集合转换成列表,这就是方法。
- 为什么?您可以简单地使用new ArrayList(map.keySet()),这是一个更直接的路径,避免创建Enumeration。我几乎可以肯定,它的性能会更好,因为从一开始,ArrayList就将以正确的大小创建。
- 这是否会返回对原始值的引用,而不是一组新对象?
- @马克:最终效果和你发布的一样:你将有一个新的ArrayList引用同一个对象,这个对象也被Map引用。
- @如果引用map中的值,则标记,但此解决方案接缝的工作速度比new ArrayList(Collection col)慢,因为使用arrays.copy函数可以立即将表复制到数组。
Collection Interface has 3 views
号
另一个则回答将hashmap转换为键和值的两个列表。完全正确
My addition: How to convert"key-value pair" (aka entrySet)into list.
号
1 2 3 4 5 6 7 8 9
| Map m =new HashMap();
m. put(3, "dev2");
m. put(4, "dev3");
List <Entry > entryList = new ArrayList <Entry >(m. entrySet());
for (Entry s : entryList ) {
System. out. println(s );
} |
。
arraylist具有此构造函数。
使用Java 8和流API解决方案:
1 2 3
| private static <K, V> List<V> createListFromMapEntries (Map<K, V> map){
return map.values().stream().collect(Collectors.toList());
} |
号
用途:
1 2 3 4 5 6 7 8 9 10
| public static void main (String[] args )
{
Map <Integer, String > map = new HashMap <>();
map. put(1, "one");
map. put(2, "two");
map. put(3, "three");
List <String > result = createListFromMapEntries (map );
result. forEach(System. out :: println );
} |
号
如果您想在列表中保持相同的顺序,请说:你的地图看起来像:
1 2 3
| map.put(1,"msg1")
map.put(2,"msg2")
map.put(3,"msg3") |
你想要你的清单看起来像
1
| ["msg1","msg2","msg3"] // same order as the map |
。
您将不得不遍历映射:
1 2 3 4 5 6 7
| // sort your map based on key, otherwise you will get IndexOutofBoundException
Map <String, String > treeMap = new TreeMap <String, String >(map )
List <String > list = new List <String >();
for (treeMap. Entry<Integer, String > entry : treeMap. entrySet()) {
list. add(entry. getKey(), entry. getValue());
} |
如果只希望它在哈希图上迭代,则不需要列表:
1 2 3 4 5 6
| HashMap <Integer, String > map = new HashMap <Integer, String >();
map. put (1, "Mark");
map. put (2, "Tarryn");
for (String s : map. values()) {
System. out. println(s );
} |
。
当然,如果您想在迭代时在结构上修改映射(即不仅仅是更改现有键的值),那么您最好使用"copy to arraylist"方法,否则您将得到一个ConcurrentModificationException。或导出为数组:
1 2 3 4 5 6
| HashMap <Integer, String > map = new HashMap <Integer, String >();
map. put (1, "Mark");
map. put (2, "Tarryn");
for (String s : map. values(). toArray(new String[]{})) {
System. out. println(s );
} |
。