Java地图迭代

时间:2013-07-10 17:21:48

标签: java map conditional bayesian

我想在地图中迭代几个条目......

wizard()中,我在map中添加了4个映射,然后发送地图以及两个输入cancertest来计算...

public int wizard() {
    Map<String, String> map = new HashMap<String, String>();
    //historical data of having cancer given test result...

    map.put("+cancer", "+test");
    map.put("-cancer", "+test");
    map.put("-cancer", "-test");
    map.put("+cancer", "+test");

    String cancer = "+cancer";
    String test = "+test";

    //send historical data to be calculated...
    return calculate(cancer, test, map);
}

在这里,calcuate()遍历地图索引,寻找与两个输入cancertest的匹配,然后返回条件概率:

public int calculate(String cancer, String test, Map<String, String> map) {
    int tests = 0;
    int both = 0;

    System.out.println("Cancer: " + cancer + "; Test: " + test);
    for (int i = 0; i <= map.size(); i++) {
        if (map.containsValue(test)) { 
            tests++;
            if (map.containsValue(cancer)) {
                both++;     
            }
        }
    }
    System.out.println("{Cancer & Tests}: " + both + "; Tests: " + tests);
    return both/tests;
}

输出:

Cancer: +cancer; Test: +test

{Cancer & Tests}: 0; {Tests}: 3

P(Cancer|Test): 0

您可以看到both++没有递增(又名:{Cancer & Tests}:不应该是0),因此P(Cancer|Test)没有给出正确答案。

这是为什么?我在地图上错误地迭代了吗?

4 个答案:

答案 0 :(得分:3)

要迭代地图,请使用entrySet()

for(Map.Entry<String, String> entry : map.entrySet()) {
    if(entry.getValue().equals(test)) {
        tests++;
        if(entry.getKey().equals(cancer)) {
            both++;
        }
    }
}

答案 1 :(得分:3)

为什么需要for循环?我不确定你想要达到什么目的。你应该在“关键”中寻找癌症。

应该已阅读

    if (map.containsKey(cancer)) {
    }

其他神秘的事情是:

    map.put("-cancer", "+test");
    map.put("-cancer", "-test");

地图中只有第二个条目。您正在用第二个条目覆盖第一个条目。

可能你可以像

那样迭代地图
    for (Map.Entry<String, String> entry : map.entrySet()) {
        String entry = entry.getKey(), value = entry.getValue();
        //Do comparisons.
        //increment counter  
    }

答案 2 :(得分:2)

containsValue方法查看地图内的值(put中的第二个),但不查看键(put中的第一个)。要确定是否在地图中,请使用containsKey方法。

但是你不仅错误地迭代了Map,而且从一开始就误用了它。 Map不允许重复键,因为键无法映射到多个值。因此,您对put的第三次和第四次调用分别覆盖了第二个和第一个键。您只有两个条目。

我会创建一个Pair类来保存您的“癌症”和“结果”值在同一个对象中,并使用Pair作为地图的关键(不要忘记覆盖equals中的hashCodePairMap正常工作。您可以使用Map<Pair, Integer>将特定组合映射到其计数。在致电put之前,请致电containsKey以查看Pair是否已经存在,如果是,put现有值加1,否则请设置值为1。在calculate中,您可以get您感兴趣的Pair个对象的计数。

要访问这些值,请使用entrySet方法获取Set中条目的Map视图。

答案 3 :(得分:0)

map.put("+cancer", "+test");
map.put("-cancer", "+test");
map.put("-cancer", "-test");
map.put("+cancer", "+test");

当您添加"+cancer""-cancer"两次时,第二次会覆盖第一次。根据定义,Map只能包含一个具有给定键的条目。每次添加具有相同键的新条目时,都会替换上一个条目。