2017-10-11 7 views
-1
class Ngram implements Comparable<Ngram>{ 
    String name; 
    int count; 

    public Ngram(String name, int count){ 
     this.name = name; 
     this.count = count; 
    } 

    ... 

    @Override 
    public int compareTo(Ngram other){ 
     return Integer.compare(this.count, other.count); 
    } 
} 

私のクラスにはcompareTo()メソッドしかありません。このメソッドは 'count'変数を使って比較します。マップのキーとしてNgramを使用すると、マップに新しいオブジェクトを挿入するときに「カウント」だけが考慮されることになりますか? equals()とhashcode()をクラスに追加する場合は、比較のためにインプリメンテーションで 'count'だけを使用する必要がありますか?compareToメソッドに基づいてmy equalsとhashcodeを実装する必要がありますか?

私の実際の質問は、Mapのキーを決定するときに、 "name"と "count"の組み合わせを使用したいのですが、マップまたはリストの要素をソートするときに、ソート目的でのみ使用できます。そのような場合、私のequalsとハッシュコードのメソッドは、比較基準として 'name'と 'count'の両方を使用しなければならないようですが、ソートにはcompareToメソッドで 'count'を使いたいだけです。どのようにこの二重の目的を達成するために?この需要は理にかなっていますか?

目標を達成するために、ほぼ同じクラスを2つ作成する必要がありますか? 2つのクラスの唯一の違いは、hashcode、equals、およびcompareTo()の実装です。そうですか?

+0

どのようなマップですか? Comparatorを提供しない限り、このクラスをTreeMapのキーとして書かれたものとして使用することはできません。その場合、その動作はComparatorによって決定され、HashMapでない限り、compareTo()メソッドは一切呼び出されません。あなたの欠けている 'equals()'と 'hashCode()'メソッドだけです。したがって、 'Object'から継承され、' compareTo() 'メソッドも何もしません。また、HashMapのキーをソートすることはできません。あなたの質問は理にかなっていません。 – EJP

答えて

-2

このクラスをマップのキーとして使用する場合は、equals()およびhashcode()を実装する必要がありますが、これはオプションではありません。

compareTo()はマップではまったく使用されていません。要素を順序付けるのが唯一の目的であり、マップは順序付けられていません。

このクラスをキーとして使用するには、2つの等しいオブジェクトが同じhashCodeを持つことを確認する必要があります。あなたの等価構造とハッシュコードの構築に同じフィールドを使用していることを確認してください。

あなたのクラスに関する最後のメモ:このカウント変数は私をちょっと怖がっています。マップのキーとしてクラスを使用するには、hashCodeを計算するために考慮するフィールドが変更されないことを確認する必要があります。キーのフィールドがマップに入れられた瞬間からそれをフェッチする瞬間までにキーのフィールドが変化した場合、マップはhashCodeを使用して内部的に値を見つけるため、問題となるhashCodeが変更されます。

+0

はい。 Comparableインターフェイスを実装しました。 – user697911

+0

@ user697911投稿したコードにはありません。これは実際のコードではありませんか? – EJP

+0

"name"と "count"(countは定数)を使用してhashcodeとequalsを実装できますが、compareTo()メソッドに対してのみ 'count'を使用できますか?私の印象は、hashcodeとequalsはcompareToメソッドと一貫していなければならないということです。ではない? – user697911

0

リスト、マップ、セットなどのオブジェクトをコレクションに入れる場合は、hashCode/equalsを実装する必要があります。たとえば、オブジェクトが存在するかどうかを知る必要があります。リストは呼び出す方法を知る必要があります;もちろん、HashMapコレクションはハッシュ方法を知る必要があります。

ComparableComparatorインターフェイスで行われているように並べ替えに直接影響はありませんが、hashCode/equalsの実装をコレクション用に追加することをお勧めします。複数のライブラリとIDEが自動生成または迅速な実装を提供します。

ところで、2つは常に一緒に実装する必要があります - その上に多くのリソース。

関連する問題