9

HashMapのDoubleの回答で説明されているように、 Doubleは、等しいかどうかを比較するのが難しいため、HashMapでは使用しないでください。私の場合は違うと思いますが、何も見えなかったので確認してもらいたいと思いました。

オブジェクトに関連付けられた一連のdouble値を作成し、それらをdouble値でソートする必要があります。TreeMapは適切なソリューションですか?もっと良いものはありますか?double値は一連の計算で生成されるため、値が重複する可能性は非常に低くなります。

編集:明確にする必要があります:必要なのは、オブジェクトのこのリストを、関連付けられているdoubleでソートすることだけです。ダブルスの値は破棄され、私は決して電話しませんmap.get(key)

4

4 に答える 4

14

ダブルスは、等しいかどうかを比較するのが難しいため、HashMapsでは使用しないでください。

  • get特定のキーに基づいて値を試してみることはありますか?

    • はいの場合、「比較が難しい」という理由が当てはまります。おそらく、そのようなデータ構造は避ける必要があります(または、常にマップの範囲を取得する//に依存する必要があります)tailMapheadMapsubmap

    • いいえの場合(つまり、通常は単に実行するfor (Double key : map.keySet()) ...か、繰り返します)、キーとしてentrySet使用しても問題ないと思います。Double

double値は一連の計算で生成されるため、値が重複する可能性は非常に低くなります。

  • 実際に複製を取得した場合、それはバグですか?

    • はいの場合、それは使用するのに適切なデータ構造ではありません。Multimapたとえば、代わりにGuavaのを使用できます。

    • いいえの場合(つまり、2つの値のどちらにマップするかは問題ではありません。いずれにせよ、それらは小さなイプシロンによってのみ異なる可能性があるためです)、問題はありません。

于 2012-07-26T19:24:06.750 に答える
2

ツリーマップのdoubleの問題は、ハッシュマップのdoubleの問題とまったく同じです。つまり、等しいかどうかを比較します。の呼び出しを避け、treeMap.get(myDouble)代わりに範囲クエリを使用する場合(たとえば、を使用してsubmap)、問題はありません。

TreeMap<Double,String> tm = new TreeMap<Double,String>();
tm.put(1.203, "quick");
tm.put(1.231, "brown");
tm.put(1.233, "fox");
tm.put(1.213, "jumps");
tm.put(1.243, "over");
tm.put(1.2301, "the");
tm.put(1.2203, "lazy");
tm.put(1.2003, "dog");
for (Map.Entry<Double,String> e : tm.subMap(1.230, 1.232).entrySet()) {
    System.out.println(e);
}

このプリント

1.2301=the
1.231=brown

ideoneでこのスニペットを参照してください。

于 2012-07-26T19:24:59.353 に答える
1

それらをソートするだけの場合は、doubleとオブジェクトの周りにラッパーオブジェクトを作成し、このラッパーに「比較可能な」インターフェイスを実装し、単純なコレクションを使用してそれらをソートするのが最善です。

于 2012-07-26T19:35:37.560 に答える
0

それらを並べ替えるだけの場合は、より適切なコレクションがあります(たとえばSortedSet)。また、任意のリストを使用して、ソート用のユーティリティを使用することもできます(私はそれらがにあると思いますjava.util.Collection)。

キーを使用してアイテムに直接アクセスする場合にのみ、マップとテーブルを使用してください。

于 2012-07-26T19:25:11.630 に答える