我想在地图中迭代几个条目......
在wizard()
中,我在map
中添加了4个映射,然后发送地图以及两个输入cancer
和test
来计算...
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)
没有给出正确答案。
这是为什么?我在地图上错误地迭代了吗?
答案 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
中的hashCode
和Pair
,Map
正常工作。您可以使用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
只能包含一个具有给定键的条目。每次添加具有相同键的新条目时,都会替换上一个条目。