2013-04-08 42 views
5

如何将Map<K, V>转换为列表List<K> keys,List<V> values,使得keysvalues中的订单匹配?我只能用找到Set<K> Map#keySet()Collection<V> Map#values(),我可以转换成列表:如何在保持顺序的同时将地图<K, V>转换为两个列表?

List<String> keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(map.values()); 

但我担心的是,为了将是随机的。

这是正确的,我必须手动转换它们或有一个快捷方式?

更新:由于我能找到我喜欢与你分享,随机谷歌用户的其他有用信息的答案: How to efficiently iterate over each Entry in a Map?

+0

我想ArrayList的保留在我们插入的顺序。 – 2013-04-08 14:15:53

+2

@AchintyaJha是的,它的确如此。但是,由地图返回的集合是否已排序? – 2013-04-08 14:17:34

+0

+1不假定两个集合(键和值)将具有相同的排序。 – yshavit 2013-04-08 15:08:14

回答

10

使用Map.entrySet():

List<String> keys = new ArrayList<>(map.size()); 
List<String> values = new ArrayList<>(map.size()); 
for(Map.Entry<String, String> entry: map.entrySet()) { 
    keys.add(entry.getKey()); 
    values.add(entry.getValue()); 
} 
+0

+1,但让我们升级到Java 1.5并使用泛型。毕竟,Java 1.8即将到来。 – yshavit 2013-04-08 15:06:28

+0

完全同意 - 我只是没有使用IDE,如果没有其中一个,就会让它们变得非常棘手。 – rongenre 2013-04-08 15:22:21

+1

修改为反映Java 7泛型。 – 2013-04-08 15:57:47

1

你应该抽取密钥的列表,你所提到的,然后遍历在他们和提取值:

List<String keys = new ArrayList<String>(map.keySet()); 
List<String> values = new ArrayList<String>(); 
for(String key: keys) { 
    values.add(map.get(key)); 
} 
+1

您也可以遍历'entrySet'来获取键和值。 – 2013-04-08 14:15:36

+0

这是真的 - 复杂性明智,它是一样的。 – Avi 2013-04-08 14:16:43

1

请注意,地图是不是一个有序集合。迭代顺序不固定。因此,当您向地图添加更多条目时,它们将出现在迭代中的随机点,因此将不再匹配您创建的任何列表。

如果你需要一个Map的迭代顺序是一样的插入的顺序看看LinkedHashMap

+0

我不关心订单,除了我需要一对(键,值)在两个结果列表中的相同“位置”。 – 2013-04-08 14:21:45

+0

这不会做'迭代器'吗?当然,你不能确定地图的顺序是什么,但是你可以确保在遍历'entrySet''迭代器时按照特定的顺序迭代。 – GameDroids 2013-04-08 14:22:40

+0

@MichaWiedenmann:那么当你把这些值放在你的两个列表中时,你没有什么可担心的。之后更改列表时请特别注意。 – GameDroids 2013-04-08 14:24:20

相关问题