2017-02-24 2 views
0

私はこれにHashMapを使うことができると思ったが、最初のキーは一意ではない - データセット内でユニークなのは、キー1とキー2の組み合わせです。dsのために<key(ユニークではない)<key, double>>のようなものが必要 - 何を使うべきかわからない

キーを文字列に連結して一意性を強制することを考えましたが、私はうまくいくはずですが、他の方法ではありません。明確にするために、私は私が...

  1. 最初のキーを検索できなデータ構造を期待していたダブル

これを格納されている第2の鍵

  • アクセスを見上げてネストされたHashMapで動作しますが、最初のキーは一意ではないため、新しい2番目のキーで更新され、次の繰り返しで2倍になります。

    検索すると、ApacheのライブラリからMultimapを使用することが推奨されるようですが、最初のキーにアクセスするときにリストを返すことは望ましくありません。私は最終的には最初のキーに続いて2番目のキーにアクセスすることでダブルを欲しがっています。

    提案がありますか?または、連結を取得しようとする必要がありますか?

    サンプルコード

    if(map.get(first[1]) != null && 
        map.get(first[1]).get(second[1]) != null) { 
    
        HashMap<String, Double> inner = map.get(first[1]); 
        inner.put(second[1], inner.get(second[1]) + 1.0); 
    
    } else { 
    
        map.put(first[1], new HashMap<>()); 
        map.get(first[1]).put(second[1], 1.0); 
    } 
    

    チェック実際には必要ではありませんが - ちょうどあなたがマルチマップを望んでいない第二の条件

  • +0

    あなたは二重だと言っていますが、そのマップには整数が入っています。問題がいくつかあります。最初のキー(外側のマップ用)を内側のマップに配置しています。内側のマップに2番目のキーがないため、以前の情報がすべて失われているだけで、外側のマップに既に新しいHashMapが挿入されている場合は、新しいHashMapを挿入します。 –

    +0

    申し訳ありませんが、そのすべてがタイプミスでした。 Double/Integerのいずれかが問題ありません。最終的には、値を更新してアクセスしようとするだけです。最初の[1] inner.putは間違いなく2番目であったはずです[1]。 – cpd1

    +0

    あなたが言及しなかった何かがあります。特定の値を挿入しようとしているのではなく、カウンタをインクリメントするように見えますか? –

    答えて

    0

    でなければなりません。あなたの最初の本能は、あなたがMap<FirstKey, Map<SecondKey, Integer>>としてそれを行うことができることは正しかった。しかし、それに挿入するには、FirstKeyの内部マップが作成されているかどうかを考慮する必要があります。

    あなたの編集に基づいて、とすると、特定の値をマップに追加するのではなく、2番目のキーがマップに挿入された回数になると思います。私はこれを考慮に入れてこの答えを書き直しました。

    ​​

    整数の代わりにDoubleを使いたい場合は簡単に変更できますが、整数は単なるカウントであればより自然です。

    +0

    ありがとうDavid!うん、私は新しいHashMapを考慮する必要があることに気付いた。しかし、最初のキーがユニークでない場合、これは問題にならないでしょうか?後で他の "foo"がありますが、 "zoo"という2番目のキーがあるように。私は "foo/bar"を失うでしょう – cpd1

    +0

    @ cpd1いいえ、あなたはしません。外側のマップには、 "bar"と "zoo"の2つのキーを含む "foo"のマップが含まれます。 –

    +0

    ok私のコードをもう一度見てみましょう。変更を繰り返していくうちに、キーが新しい値に置き換えられるのが分かりました。 – cpd1

    関連する問題

     関連する問題