Map<String, String> map = ... for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println(entry.getKey() + "/" + entry.getValue()); }
仅供参考,您也可以使用 map.keySet() 和 map.values() 如果你只对地图的键/值感兴趣而不是对另一个感兴趣。
map.keySet()
map.values()
你可以使用泛型来做到这一点:
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<Integer, Integer> entry = entries.next(); System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); }
使用Java 8:
map.entrySet().forEach(entry -> System.out.println(entry.getValue()));
有很多方法可以做到这一点。以下是几个简单的步骤:
假设您有一个地图,如:
Map<String, Integer> m = new HashMap<String, Integer>();
然后你可以做类似下面的事情迭代地图元素。
// ********** Using an iterator **************** Iterator<Entry<String, Integer>> me = m.entrySet().iterator(); while(me.hasNext()){ Entry<String, Integer> pair = me.next(); System.out.println(pair.getKey() + ":" + pair.getValue()); } // *********** Using foreach ************************ for(Entry<String, Integer> me : m.entrySet()){ System.out.println(me.getKey() + " : " + me.getValue()); } // *********** Using keySet ***************************** for(String s : m.keySet()){ System.out.println(s + " : " + m.get(s)); } // *********** Using keySet and iterator ***************** Iterator<String> me = m.keySet().iterator(); while(me.hasNext()){ String key = me.next(); System.out.println(key + " : " + m.get(key)); }
这是一个两部分问题:
如何迭代Map的条目 - @ ScArcher2有 回答 那完美。
迭代的顺序是什么 - 如果你刚刚使用 Map ,严格来说,有 的 没有订购保证 强> 。所以你不应该真正依赖任何实现给出的顺序。然而 SortedMap 界面扩展 Map 并提供您正在寻找的内容 - 实现将提供一致的排序顺序。
Map
SortedMap
的 NavigableMap 是另一个有用的扩展 强> - 这是一个 SortedMap 使用其他方法按键集中的有序位置查找条目。因此,这可能会消除首先迭代的需要 - 您可能能够找到具体的 entry 你在使用之后 higherEntry , lowerEntry , ceilingEntry , 要么 floorEntry 方法。该 descendingMap 方法甚至给你一个明确的方法 的 颠倒遍历顺序 强> 。
NavigableMap
entry
higherEntry
lowerEntry
ceilingEntry
floorEntry
descendingMap
package com.test; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; public class Test { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("ram", "ayodhya"); map.put("krishan", "mathura"); map.put("shiv", "kailash"); System.out.println("********* Keys *********"); Set<String> keys = map.keySet(); for (String key : keys) { System.out.println(key); } System.out.println("********* Values *********"); Collection<String> values = map.values(); for (String value : values) { System.out.println(value); } System.out.println("***** Keys and Values (Using for each loop) *****"); for (Map.Entry<String, String> entry : map.entrySet()) { System.out.println("Key: " + entry.getKey() + "\t Value: " + entry.getValue()); } System.out.println("***** Keys and Values (Using while loop) *****"); Iterator<Entry<String, String>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<String, String> entry = (Map.Entry<String, String>) entries .next(); System.out.println("Key: " + entry.getKey() + "\t Value: " + entry.getValue()); } System.out .println("** Keys and Values (Using java 8 using lambdas )***"); map.forEach((k, v) -> System.out .println("Key: " + k + "\t value: " + v)); } }
我们有 forEach 接受a的方法 lambda表达式 。我们也有 流 蜜蜂。考虑一张地图:
forEach
Map<String,String> sample = new HashMap<>(); sample.put("A","Apple"); sample.put("B", "Ball");
的 迭代键: 强>
sample.keySet().forEach((k) -> System.out.println(k));
的 迭代值: 强>
sample.values().forEach((v) -> System.out.println(v));
的 迭代条目(使用forEach和Streams): 强>
sample.forEach((k,v) -> System.out.println(k + "=" + v)); sample.entrySet().stream().forEach((entry) -> { Object currentKey = entry.getKey(); Object currentValue = entry.getValue(); System.out.println(currentKey + "=" + currentValue); });
流的优点是它们可以在我们想要的情况下轻松并行化。我们只需要使用 parallelStream() 代替 stream() 以上。
parallelStream()
stream()
的 forEachOrdered VS forEach 有溪流? 强> 该 forEach 不遵循遭遇顺序(如果定义)并且本质上是非确定性的,就像forEachOrdered一样。因此,forEach不保证订单会被保留。还检查一下 这个 更多。
forEachOrdered
在Map中,可以迭代 keys 和/或 values 和/或 both (e.g., entrySet) 取决于一个人的兴趣_喜欢:
keys
values
both (e.g., entrySet)
1.)迭代通过 keys -> keySet() 地图:
keys -> keySet()
Map<String, Object> map = ...; for (String key : map.keySet()) { //your Business logic... }
2.)迭代通过 values -> values() 地图:
values -> values()
for (Object value : map.values()) { //your Business logic... }
3.)迭代通过 both -> entrySet() 地图:
both -> entrySet()
for (Map.Entry<String, Object> entry : map.entrySet()) { String key = entry.getKey(); Object value = entry.getValue(); //your Business logic... }
此外,通过HashMap迭代有3种不同的方法。它们如下 _
//1. for (Map.Entry entry : hm.entrySet()) { System.out.print("key,val: "); System.out.println(entry.getKey() + "," + entry.getValue()); } //2. Iterator iter = hm.keySet().iterator(); while(iter.hasNext()) { Integer key = (Integer)iter.next(); String val = (String)hm.get(key); System.out.println("key,val: " + key + "," + val); } //3. Iterator it = hm.entrySet().iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); Integer key = (Integer)entry.getKey(); String val = (String)entry.getValue(); System.out.println("key,val: " + key + "," + val); }
Iterator iterator = map.entrySet().iterator(); while (iterator.hasNext()) { Map.Entry element = (Map.Entry)it.next(); LOGGER.debug("Key: " + element.getKey()); LOGGER.debug("value: " + element.getValue()); }
迭代地图有几种方法。
这里是通过在地图中存储一百万个键值对来比较它们在地图中存储的公共数据集的性能,并将迭代在地图上。
的 1)使用 entrySet() 在每个循环中 强>
entrySet()
for (Map.Entry<String,Integer> entry : testMap.entrySet()) { entry.getKey(); entry.getValue(); }
50毫秒
的 2)使用 keySet() 在每个循环中 强>
keySet()
for (String key : testMap.keySet()) { testMap.get(key); }
76毫秒
的 3)使用 entrySet() 和迭代器 强>
Iterator<Map.Entry<String,Integer>> itr1 = testMap.entrySet().iterator(); while(itr1.hasNext()) { Map.Entry<String,Integer> entry = itr1.next(); entry.getKey(); entry.getValue(); }
的 4)使用 keySet() 和迭代器 强>
Iterator itr2 = testMap.keySet().iterator(); while(itr2.hasNext()) { String key = itr2.next(); testMap.get(key); }
75毫秒
我已经提过了 this link 。
this link
如果你的理由迭代了 Map ,是对值进行操作并写入结果 Map 。我建议使用 transform - 方法 谷歌番石榴 Maps 类。
transform
Maps
import com.google.common.collect.Maps;
添加完之后 Maps 你的进口,你可以使用 Maps.transformValues 和 Maps.transformEntries 在你的地图上,像这样:
Maps.transformValues
Maps.transformEntries
public void transformMap(){ Map<String, Integer> map = new HashMap<>(); map.put("a", 2); map.put("b", 4); Map<String, Integer> result = Maps.transformValues(map, num -> num * 2); result.forEach((key, val) -> print(key, Integer.toString(val))); // key=a,value=4 // key=b,value=8 Map<String, String> result2 = Maps.transformEntries(map, (key, value) -> value + "[" + key + "]"); result2.forEach(this::print); // key=a,value=2[a] // key=b,value=4[b] } private void print(String key, String val){ System.out.println("key=" + key + ",value=" + val); }
同 的 Java 8 强>
map.forEach((k, v) -> System.out.println((k + ":" + v)));
public class abcd{ public static void main(String[] args) { Map<Integer, String> testMap = new HashMap<Integer, String>(); testMap.put(10, "a"); testMap.put(20, "b"); testMap.put(30, "c"); testMap.put(40, "d"); for (Integer key:testMap.keySet()) { String value=testMap.get(key); System.out.println(value); } } }
要么
public class abcd { public static void main(String[] args) { Map<Integer, String> testMap = new HashMap<Integer, String>(); testMap.put(10, "a"); testMap.put(20, "b"); testMap.put(30, "c"); testMap.put(40, "d"); for (Entry<Integer, String> entry : testMap.entrySet()) { Integer key=entry.getKey(); String value=entry.getValue(); } } }
从理论上讲,最有效的方法将取决于Map的实现。这样做的正式方法是打电话 map.entrySet() ,返回一组 Map.Entry ,每个都包含一个键和一个值( entry.getKey() 和 entry.getValue() )。
map.entrySet()
Map.Entry
entry.getKey()
entry.getValue()
在特殊的实现中,无论您使用它还是会有所不同 map.keySet() , map.entrySet() 或者是其他东西。但我想不出有人会这样写的原因。很可能它对你的表现没有任何影响。
是的,订单将取决于实施 - 以及(可能)插入顺序和其他难以控制的因素。
[编辑]我写道 valueSet() 最初但当然 entrySet() 实际上是答案。
valueSet()
//Functional Oprations Map<String, String> mapString = new HashMap<>(); mapString.entrySet().stream().map((entry) -> { String mapKey = entry.getKey(); return entry; }).forEach((entry) -> { String mapValue = entry.getValue(); }); //Intrator Map<String, String> mapString = new HashMap<>(); for (Iterator<Map.Entry<String, String>> it = mapString.entrySet().iterator(); it.hasNext();) { Map.Entry<String, String> entry = it.next(); String mapKey = entry.getKey(); String mapValue = entry.getValue(); } //Simple for loop Map<String, String> mapString = new HashMap<>(); for (Map.Entry<String, String> entry : mapString.entrySet()) { String mapKey = entry.getKey(); String mapValue = entry.getValue(); }
使用迭代器和泛型的示例:
Iterator<Map.Entry<String, String>> entries = myMap.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<String, String> entry = entries.next(); String key = entry.getKey(); String value = entry.getValue(); // ... }
为了总结其他答案并将它们与我所知道的结合起来,我找到了10种主要方法(见下文)。另外,我写了一些性能测试(见下面的结果)。例如,如果我们想要找到地图的所有键和值的总和,我们可以写:
运用 的 迭代器 强> 和 的 Map.Entry的 强>
long i = 0; Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator(); while (it.hasNext()) { Map.Entry<Integer, Integer> pair = it.next(); i += pair.getKey() + pair.getValue(); }
运用 的 的foreach 强> 和 的 Map.Entry的 强>
long i = 0; for (Map.Entry<Integer, Integer> pair : map.entrySet()) { i += pair.getKey() + pair.getValue(); }
运用 的 的forEach 强> 来自Java 8
final long[] i = {0}; map.forEach((k, v) -> i[0] += k + v);
运用 的 中的keySet 强> 和 的 的foreach 强>
long i = 0; for (Integer key : map.keySet()) { i += key + map.get(key); }
运用 的 中的keySet 强> 和 的 迭代器 强>
long i = 0; Iterator<Integer> itr2 = map.keySet().iterator(); while (itr2.hasNext()) { Integer key = itr2.next(); i += key + map.get(key); }
运用 的 对于 强> 和 的 Map.Entry的 强>
long i = 0; for (Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) { Map.Entry<Integer, Integer> entry = entries.next(); i += entry.getKey() + entry.getValue(); }
使用Java 8 的 流API 强>
final long[] i = {0}; map.entrySet().stream().forEach(e -> i[0] += e.getKey() + e.getValue());
使用Java 8 的 流API并行 强>
final long[] i = {0}; map.entrySet().stream().parallel().forEach(e -> i[0] += e.getKey() + e.getValue());
运用 的 IterableMap 强> 的 Apache Collections
Apache Collections
long i = 0; MapIterator<Integer, Integer> it = iterableMap.mapIterator(); while (it.hasNext()) { i += it.next() + it.getValue(); }
运用 的 MutableMap 强> Eclipse(CS)集合
final long[] i = {0}; mutableMap.forEachKeyValue((key, value) -> { i[0] += key + value; });
的 性能测试 强> (mode = AverageTime,system = Windows?8.1 64-bit,Intel i7-4790 3.60 GHz,16?GB)
对于小地图(100个元素),得分0.308是最好的
Benchmark Mode Cnt Score Error Units test3_UsingForEachAndJava8 avgt 10 0.308 锟斤拷 0.021 ?s/op test10_UsingEclipseMap avgt 10 0.309 锟斤拷 0.009 ?s/op test1_UsingWhileAndMapEntry avgt 10 0.380 锟斤拷 0.014 ?s/op test6_UsingForAndIterator avgt 10 0.387 锟斤拷 0.016 ?s/op test2_UsingForEachAndMapEntry avgt 10 0.391 锟斤拷 0.023 ?s/op test7_UsingJava8StreamApi avgt 10 0.510 锟斤拷 0.014 ?s/op test9_UsingApacheIterableMap avgt 10 0.524 锟斤拷 0.008 ?s/op test4_UsingKeySetAndForEach avgt 10 0.816 锟斤拷 0.026 ?s/op test5_UsingKeySetAndIterator avgt 10 0.863 锟斤拷 0.025 ?s/op test8_UsingJava8StreamApiParallel avgt 10 5.552 锟斤拷 0.185 ?s/op
对于10000个元素的地图,得分37.606是最好的
Benchmark Mode Cnt Score Error Units test10_UsingEclipseMap avgt 10 37.606 锟斤拷 0.790 ?s/op test3_UsingForEachAndJava8 avgt 10 50.368 锟斤拷 0.887 ?s/op test6_UsingForAndIterator avgt 10 50.332 锟斤拷 0.507 ?s/op test2_UsingForEachAndMapEntry avgt 10 51.406 锟斤拷 1.032 ?s/op test1_UsingWhileAndMapEntry avgt 10 52.538 锟斤拷 2.431 ?s/op test7_UsingJava8StreamApi avgt 10 54.464 锟斤拷 0.712 ?s/op test4_UsingKeySetAndForEach avgt 10 79.016 锟斤拷 25.345 ?s/op test5_UsingKeySetAndIterator avgt 10 91.105 锟斤拷 10.220 ?s/op test8_UsingJava8StreamApiParallel avgt 10 112.511 锟斤拷 0.365 ?s/op test9_UsingApacheIterableMap avgt 10 125.714 锟斤拷 1.935 ?s/op
对于具有100000个元素的地图,得分1184.767是最好的
Benchmark Mode Cnt Score Error Units test1_UsingWhileAndMapEntry avgt 10 1184.767 锟斤拷 332.968 ?s/op test10_UsingEclipseMap avgt 10 1191.735 锟斤拷 304.273 ?s/op test2_UsingForEachAndMapEntry avgt 10 1205.815 锟斤拷 366.043 ?s/op test6_UsingForAndIterator avgt 10 1206.873 锟斤拷 367.272 ?s/op test8_UsingJava8StreamApiParallel avgt 10 1485.895 锟斤拷 233.143 ?s/op test5_UsingKeySetAndIterator avgt 10 1540.281 锟斤拷 357.497 ?s/op test4_UsingKeySetAndForEach avgt 10 1593.342 锟斤拷 294.417 ?s/op test3_UsingForEachAndJava8 avgt 10 1666.296 锟斤拷 126.443 ?s/op test7_UsingJava8StreamApi avgt 10 1706.676 锟斤拷 436.867 ?s/op test9_UsingApacheIterableMap avgt 10 3289.866 锟斤拷 1445.564 ?s/op
图表(性能测试取决于地图大小)
表(性能测试取决于地图大小)
100 600 1100 1600 2100 test10 0.333 1.631 2.752 5.937 8.024 test3 0.309 1.971 4.147 8.147 10.473 test6 0.372 2.190 4.470 8.322 10.531 test1 0.405 2.237 4.616 8.645 10.707 test2 0.376 2.267 4.809 8.403 10.910 test7 0.473 2.448 5.668 9.790 12.125 test9 0.565 2.830 5.952 13.220 16.965 test4 0.808 5.012 8.813 13.939 17.407 test5 0.810 5.104 8.533 14.064 17.422 test8 5.173 12.499 17.351 24.671 30.403
所有测试都已开启 GitHub上 。
最紧凑的Java 8:
map.entrySet().forEach(System.out::println);