3

こんにちは私はとHashMap<String, Double>として知られているdouble値を返す関数も持っていますanswer。HashMapのどの値が回答に最も近いかを確認してから、その値のキーを取得して印刷したいと思います。

HashMap<String, Double> output = new HashMap<String, Double>();


contents
("A", 0)
("B", 0.25)
("C", 0.5)
("D", 0.75)
("E", 1)

私の関数の1つに対する答えが0.42だったとすると、どの値に最も近いかを確認して、その値のキーを取得するにはどうすればよいですか。HashMapのキーと値を切り替えることはできません(前の関数が各文字に均等に値を割り当てるため)。そうでない場合は、各キーを調べて値を取得する方がよいでしょう。

4

4 に答える 4

8

値が一意の場合は、niceとメソッドを持つNavigableMapを実装するTreeMapを使用できます。ceilingKeyfloorKey

    NavigableMap<Double, String> map = new TreeMap<>();
    map.put(0d, "A");
    map.put(0.25, "B");
    map.put(0.5, "C");
    map.put(0.75, "D");
    map.put(1d, "E");

    double value = 0.42;
    double above = map.ceilingKey(value);
    double below = map.floorKey(value);

    System.out.println(value - below > above - value ? above : below); //prints 0.5

value注:が最小/最大キーよりも小さい (または大きい) 場合、どちらのメソッドも null を返すことができます。

于 2013-03-12T22:49:26.867 に答える
4

HashMap場合、各エントリを通過する必要があります。

ただし、パフォーマンスが重要で、この方法で複数のエントリを検索する場合は、別のコレクションを作成できます。値でソートされたハッシュ マップ内のエントリのリストまたは配列です。次に、バイナリ検索を実行して、最も近い値を持つエントリをより効率的に見つけ、キーを返すことができます。もちろん、これをマップごとに 1 回だけ行う場合は役に立ちません...

于 2013-03-12T22:30:33.057 に答える
0

「最も近い」という概念は、ハッシュされたデータ構造にはあまり意味がありません。効率的なハッシュ アルゴリズムの主な目標は衝突の回避です。衝突しているかどうかのどちらかです。

順序付けられたキー データ構造 (例: ) についてこれを求めていた場合TreeMap、答えは異なります。

于 2013-03-12T22:30:52.717 に答える
0

HashMap は、これを行うのに最適な構造ではありません。output.keySet() を取得して、各値を確認できます。次に例を示します。

for(String key:output.keySet()){
   Double temp=Math.abs(output.get(key)-answer);
   if(temp<min){
     min=temp;
     nearest=key;
   }
}

しかし、それは最善の方法ではありません。あなたはハッシュマップを使用することを余儀なくされていますか? ちなみに、チェックする答えが常に5つある場合、これは問題ではありません...

于 2013-03-12T22:40:52.393 に答える