0

我想遍历地图中的几个条目......

wizard()中,我将 4 个映射放入map,然后将映射与两个输入一起发送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()遍历映射索引以查找与两个输入cancer和的匹配test,然后返回条件概率:

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

4 回答 4

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  
    }
于 2013-07-10T17:34:31.083 回答
3

要遍历地图,请使用entrySet()

for(Map.Entry<String, String> entry : map.entrySet()) {
    if(entry.getValue().equals(test)) {
        tests++;
        if(entry.getKey().equals(cancer)) {
            both++;
        }
    }
}
于 2013-07-10T17:27:24.257 回答
2

containsValue方法查看映射内部的值(第二个put),而不是键(第一个put)。要确定某个是否在映射中,请使用该containsKey方法。

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

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

要访问这些值,请使用该方法entrySet获取.SetMap

于 2013-07-10T17:28:44.440 回答
0
map.put("+cancer", "+test");
map.put("-cancer", "+test");
map.put("-cancer", "-test");
map.put("+cancer", "+test");

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

于 2013-07-10T17:29:25.273 回答