2013-07-10 90 views
0

我想遍歷地圖中的幾個條目...Java的地圖迭代

wizard(),我把4名映射在map,然後發送地圖有兩個輸入cancertest一起被calcuated ...

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)沒有給予正確的答案。

這是爲什麼?我是否在地圖上錯誤地迭代?

回答

3

爲什麼你需要一個循環?我不確定你想要達到什麼目的。你應該在「關鍵」中尋找癌症。

應該已經閱讀

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 
    } 
3

要遍歷在地圖上,使用entrySet()

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

containsValue方法着眼於屬於地圖(在第二put)內的值,但不是鍵(第一中put)。以確定是否是在圖中,使用containsKey方法。

但是,不僅是你遍歷Map不正確,你從一開始誤用。一個Map不允許重複鍵,因爲密鑰不能映射到多個值。所以,你的第三次和第四次調用put分別覆蓋第二個和第一個鍵。你只有兩個條目。

我會創造一個Pair類來保存你的「癌症」,並在同一個對象的「結果」的價值觀,並使用Pair爲重點,以您的地圖(不要忘了覆蓋PairequalshashCode,所以Map工作正常)。您可以使用將特定組合映射到其計數的Map<Pair, Integer>。你叫put之前,調用containsKey看是否Pair已經存在,如果是這樣,put現有的值加1,要不然就把1的值。然後,在calculate,您可以getPair對象你的計數

要訪問這些值,請使用entrySet方法獲得Map中條目的Set視圖。

+0

好,嗯,是有一些其他的方式做一個關聯數組,如:'$ DATA [0] =陣列( 「+癌症」,「+測試「);','$ Data [1] = array(」 - cancer「,」-test「);'?我只想遍歷關聯數組的每個部分,並查看這些值是否包含在特定的數組索引處。 – Growler

+0

我已經用可能的解決方案修改了我的答案。 – rgettman

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

當您添加或"+cancer"兩次"-cancer",第二次覆蓋的第一個。根據定義,Map只能包含一個給定鍵的條目。每次使用相同的密鑰添加新條目時,都會替換之前的條目。

+0

好的,有沒有其他的方法來做一個關聯數組,如:'$ Data [0] = array(「+ cancer」,「+ test」);','Data [1] = array(「 - 癌症「,」 - 測試「);'?我只想遍歷關聯數組的每個部分,並查看這些值是否包含在特定的數組索引處。 – Growler

+1

「Map」是一個關聯數組。如果您想將_multiple values_與一個鍵相關聯,您需要一個'MultiMap',它不是標準Java集合的一部分,儘管有幾種實現可用作開源庫。 –