我是Java的新手(来自Adobe LiveCycle上的JavaScript开发)并面临以下问题:
我有一个包含多个项目的String数组。我想只放置值为" a"到HashMap。但不是3" a" HashMap中的值我得到1个空值。这是为什么?
String[] s = {"a", "a", "b", "a"};
Map m = new HashMap();
for (int i = 0; i < s.length; i++) {
if (s[i].equals("a")) {
m.put(i, s[i]);
}
}
for (int i = 0; i < m.size(); i++) {
System.out.println(m.get(i));
}
// Prints
//a
//a
//null
答案 0 :(得分:2)
您正在使用键0
,1
和3
将项目放入地图中。
您正在使用密钥0
,1
,2
将其删除。
使用:
for (Object o : m.keySet()) {
System.out.println(m.get(o));
}
或 - 更好:
Map<Integer, String> m = new HashMap<>();
...
for (Integer i : m.keySet()) {
System.out.println(i + " -> " + m.get(i));
}
答案 1 :(得分:1)
您将具有相应索引的项目放在s
的数组Map
中,即您拥有内容为Map
的{{1}}。因此,如果您尝试使用密钥{0=a, 1=a, 3=a}
(2
)访问地图,则会收到m.get(2)
,因为null
中找不到密钥2
。
我建议不要使用m
- 循环超过for
的大小,而是建议通过{{m
keySet()
进行迭代3}}:
m
旁注:您正在使用foreach
-loop。您应该正确绑定for (Object key : m.keySet()) {
System.out.println("key: " + key + ", value: " + m.get(key));
}
和Map
的类型(有关详细信息,请参阅raw types):HashMap
。使用正确绑定的类型,Map<Integer, String> m = new HashMap<Integer, String>();
- 循环中的key
可以是for
或int
类型。我建议输入Integer
以避免不必要的Javadoc of Map
。
答案 2 :(得分:1)
您的代码工作正常,但您没有正确访问它。
String[] s = {"a", "a", "b", "a"};
for (int i = 0; i < s.length; i++) {
if (s[i].equals("a")) {
m.put(i, s[i]);
}
}
这就像这样
First iteration : m.put(0, "a");
Second iteration : m.put(1, "a");
Third iteration : "b" doest not equal "a" but still counts the index i up
Fourth iteration: m.put(3, "a");
除了其他答案,您仍然可以使用基于范围的循环并使用Iterator
Iterator<String> it = m.values().iterator();
while (it.hasNext()) {
System.out.println(it.next());
}