首先,我想说我是Map界面的新手并且昨天开始学习它,我发现了这个程序
public class maptest{
public static void main(String[] args) {
Map<String, Integer> m = new HashMap<String, Integer>();
String argss[]={"i","came","i","left","i","saw"};
for (String a : argss) {
Integer freq = m.get(a);
m.put(a, (freq == null) ? 1 : freq + 1);
}
System.out.println(m.size() + " distinct words:");
System.out.println(m);
}
}
它的输出是
4个不同的词: {saw = 1,left = 1,came = 1,i = 3}
我想知道我还没有在Map中放任何东西但我刚刚宣布了一个字符串数组,所以我怎么能用
m.get(a)的
因为我的Map中没有任何内容。我只能通过PUT方法在Map中添加内容。
答案 0 :(得分:3)
// first time that a is "i"
Integer freq = m.get(a); // returns null because "i" is not in the map
m.put(a, (freq == null) ? 1 : freq + 1); // associates 1 to the key "i"
// second time that a is "i"
Integer freq = m.get(a); // returns 1 because "i" is associated with 1
m.put(a, (freq == null) ? 1 : freq + 1); // associates freq+1 (=2) to the key "i"
// second time that a is "i"
Integer freq = m.get(a); // returns 2 because "i" is associated with 2
m.put(a, (freq == null) ? 1 : freq + 1); // associates freq+1 (=3) to the key "i"
如果没有与m.get(a)
相关联的值,则null
会在第一步中返回a
。换句话说,如果您从未遇到过某个词,那么您还没有任何频率,所以您在这里得到null
:
Integer freq = m.get(a); // returns null if a is not associated
但是,如果已经遇到这个词,我们确实在地图中放了一些非空的东西(频率)。因此,您将获得与密钥关联的频率。
注意: null
值可能意味着&#34; null
与a
&#34; 相关联(不仅&#34; a
不在地图中&#34; )。但是,我们从未将null
作为任何键的值(请参阅下一节)。
这是使用ternary operator *:如果freq
是null
,它会在地图中放置1;如果freq+1
不为空,则放置freq
:
m.put(a, (freq == null) ? 1 : freq + 1);
我们在地图中放置的值与a
当前持有的键相关联,替换以前的任何值。稍后对get()
的调用将返回我们刚刚放入的新值。
(*)这样的结构:condition ? value_if_true : value_if_false
答案 1 :(得分:2)
这个循环,
for (String a : argss) {
Integer freq = m.get(a);
m.put(a, (freq == null) ? 1 : freq + 1);
}
以freq中的null开头,但是put然后将null变为1,其中三元表达式就像if -
// m.put(a, (freq == null) ? 1 : freq + 1);
if (freq == null) {
m.put(a, 1);
} else {
m.put(a, freq + 1);
}
修改强>
来自javadoc(强调我的) -
如果此地图不包含该键的映射,则返回指定键映射到的值,或null 。 / p>
null
是概念&#34;而不是价值&#34;。如果你想要防范它,你可以测试地图是否包含给定键的值。该方法为boolean containsKey(Object)。
答案 2 :(得分:1)
在你的for循环中,你可以预先测试,如果元素在地图中,如果没有,你将频率为0放入其中。
for (String a : argss) {
if(m.get(a) == null) {
m.put(a,0);
}
Integer freq = m.get(a);
m.put(a, freq + 1);
}
答案 3 :(得分:1)
按行 m.get(一);你正在获得价值。对于第一种情况,它是空的。
现在通过Line m.put(a,(freq == null)?1:freq + 1);
您正在将值设置为a(来自字符串数组),如果freq == null,则将值加1。 如果它不为null,则将频率值增加1.