如果我没有把它放进去,我如何从地图中获取一个元素?

时间:2014-04-18 11:01:29

标签: java hashmap

首先,我想说我是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中添加内容。

4 个答案:

答案 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; nulla&#34; 相关联(不仅&#34; a不在地图中&#34; )。但是,我们从未将null作为任何键的值(请参阅下一节)。

第二步细节(放)

这是使用ternary operator *:如果freqnull,它会在地图中放置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.