2

Javaでは、Comparatorインターフェースを使用すると、クライアントは任意のタイプのequals()およびcompare()メソッドを指定できます。Comparatorは、並べ替えが必要なほとんど(またはすべて)のコレクションに渡すことができ、指定されたクラスのメソッドの代わりにComparatorのメソッドが使用されます。これにより、クライアントは、自然な順序とは異なる方法でオブジェクトを並べ替えたり、自然な順序を持たない(つまり、Comparableを実装していない)オブジェクトを並べ替えたりすることができます。

ハッシュ用の同様のインターフェースがないのはなぜですか?hashCode()とequals()の2つのメソッドを指定でき、コンパレーターがソートに役立つのと同じように、HashSetsまたはHashMapsに役立ちます。

編集:この質問をこの他の質問の複製としてマークした人のために、他の質問はなぜハッシュコードがインターフェースではなくすべてのクラスに含まれているのかを尋ねますが、この質問はハッシュ関数を抽象化して複数の実装を可能にすることについてです。

回答編集:この機能を取得するための最良の方法は次のようです:

-外部ライブラリを使用しても問題がない場合、および/またはすでにGuava(多くの理由で素晴らしいライブラリです)を使用している場合、Guavaにはこれを可能にするEquivalentクラスがあります。

-外部ライブラリを使用したくない場合は、このSOの質問の一番上の回答で行われているのと同様に、カスタムビルドのアダプタを使用できます。

4

5 に答える 5

4

フォームの質問

「JavaにXXXがないのはなぜですか」

一般的なものを除いて客観的に答えることは難しい

「決定が下されたとき、ここの誰も部屋にいなかったので、私たちは知りません。」

この場合:

  • 表面的には、この要件は技術的な観点から実装できます。

  • この要件は、RFEを介して何度も提案されています。最も直接的なものは http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6435963です。特に理由はありませんが、RFEはWONTFIXとしてマークされています。

  • この要件は、サードパーティのライブラリによって満たされる可能性があり、十分に満たされています。

私がこれを読んだのは、それがサポートされる必要があるほど十分な人々にとって重要であると見なされていないため、サポートされていないということです。彼らはそれについて合理的な呼びかけをしたと思います。

于 2013-03-16T23:54:52.457 に答える
1

また、このようなインターフェースは、特にコレクション内のさまざまな種類の同等性を検討する方法として便利だと思います。これは、オブジェクトを作成する方法と似ている必要がありますがComparable、他のを提供することにより、特定のコレクションでその動作をオーバーライドしますComparator

この質問で指摘されたように、Guavaには、Equivalenceクラスをラップし、ラッパーレベルでこのコンテキストでの「同等性」の意味を定義できるようにすることで、これを行う方法を提供するクラスがあります。

あなたの質問が本当に言語設計時にこれが起こらなかった理由であるなら...まあ、ねえ、ジェームズ・ゴスリングと会社は人間だけですよね?

于 2013-03-16T23:09:57.217 に答える
0

ハッシュには、実際には1つの要件があります。それは、ハッシュメソッドのようであることです。したがって、誰がどのように、どのような目的で使用するかを知らなくても、あるタイプに実装できます。したがって、オブジェクト自体のハッシュメソッドで十分です。

一方、等しいとは、コンテキストによって意味が異なります。たとえば、名前、名前、年齢、サイズ、体重、クラブのメンバーシップの時間で人を並べ替えることができます...したがって、単一のクラスに対して等しい(および「未満」)のさまざまな実装を持つことは理にかなっています。

もちろん、そのようなインターフェースを作成して使用することを妨げるものは何もありません...

于 2013-03-16T23:00:50.177 に答える
0

いつでもhashcode()を変更して、HashMapがオブジェクトをMapに配置する方法を指定し、クラスに効果的なハッシュコードメソッドを実装することでそのパフォーマンスを向上させることができます。

HashMapがハッシュデータからの追加と削除を実行する方法はHashMapの内部であり、それを変更することは基本的にadd、removeメソッドなどを変更することを意味します。

また、並べ替えはより頻繁に使用される一般的な機能であり、まれに、マップでのハッシュの発生方法を本当に変更したい場合は、マップを拡張するオプションが常にあります。

于 2013-03-16T23:05:42.307 に答える
0

私がそれをどのように見ているのか、なぜかを言いましょう。

簡単に言うと、リストオブジェクトを並べ替える必要がある場合がよくありますが、オブジェクトのリストのIDを相互比較する必要がある場合はまれです。


Objectでは、メソッドhashCodeは二次的で役立つメソッドであり、その主な目的はequalsメソッドを提供することです。合意は、2つのオブジェクトに対してhashCodeが異なる値を返す場合、equalsはtrueを返さないようにする必要があるということです。

したがって、メソッドhashCodeおよびequalsは、オブジェクトのIDを確立するのに役立ちます。

メソッドcompareTo(ComparableとComparatorの両方)は、別の一般的な目的を果たします。これは、オブジェクトのIDではなく、オブジェクトの順序を定義します。

Resume- compareToはオブジェクト順序を定義し、hashCodeは( equalsとともに)オブジェクトのIDを定義します。


繰り返しになりますが、実践的な貢献は、オブジェクトのグループを並べ替える必要がある場合が多いことですが、オブジェクトのグループを取得してそれらのIDを相互比較する必要があることはめったにありません。

于 2013-03-17T01:07:14.363 に答える