0

マップ内の複数のエントリを繰り返し処理したい...

ではwizard()、4 つのマッピングを に配置しmap、マップを 2 つの入力とともに送信して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);
}

ここでは、2 つの入力および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

4 に答える 4

2

このcontainsValueメソッドは、マップ内の値 ( の 2 番目put) を調べますが、キー ( の 1 番目) は調べませんputキーがマップ内にあるかどうかを判断するには、containsKeyメソッドを使用します。

しかし、Map誤って反復処理を行っているだけでなく、最初から誤用しています。Mapキーは複数の値にマップできないため、重複キーは許可されません。したがって、3 番目と 4 番目の呼び出しはput、それぞれ 2 番目と最初のキーを上書きします。エントリは 2 つだけです。

Pair「がん」と「結果」の値を同じオブジェクトに保持するクラスを作成Pairし、マップのキーとして使用します(オーバーライドすることを忘れないでくださいequalshashCodein PairMap正しく動作します)。Map<Pair, Integer>特定の組み合わせをそのカウントにマップする を使用できます。を呼び出す前にput、 を呼び出して、 が既に存在するcontainsKeyかどうかを確認します。存在する場合は、既存の値に 1 を加えます。そうでない場合は、値を 1 に設定します。次に、 で、関心のあるオブジェクトの数を数えることができます。PairputcalculategetPair

値にアクセスするには、entrySetメソッドを使用しSetて のエントリのビューを取得しますMap

于 2013-07-10T17:28:44.440 に答える