2011-12-16 7 views
1

hashmap<CustomObject,Integer>があります。各エントリ内のIntegers(値)を比較したいと思います。だから、基本的に私の値を降順で値をIntegerでソートしたいのですが。私は、次の要素で構成さComparator ...HashMapをオブジェクトと比較する

class Compare implements Comparator<Integer>{ 
    Map<CustomObject,Integer> map; 
    /** 
    * Constructs our map 
    * @param map map to be sorted. 
    */ 
    public Compare(Map<CustomObject,Integer> map){ 
     this.map = map; 
    } 
    /** 
    * Performs the comparison between two entries. 
    */ 
    public int compare(Integer one, Integer two){ 
     if(map.get(one) <= map.get(two)){ 
      return 1; 
     }else{ 
      return 0; 
     } 
    } 
} 

が、私は次のコード行... Tmap.putAll(Hmap);を呼び出すことで、私のHashmapのTreeMapに渡すんです。私は私のコードを実行すると、私はエラーを取得しException in thread "main" java.lang.ClassCastException: CustomObject cannot be cast to java.lang.Comparable

private HashMap<CustomObject,Integer> Hmap; 
private TreeMap<CustomObject,Integer> Tmap; 

:TMAPとHMAPは以下のように定義されている場合。

ソートされたリストから値を抽出しようとしたときに例外が発生したようです。そうですね...

TreeMap<CustomObject,Integer> sorted = Tmap.putAll(hmap); 
sorted.get(o); 

oはCustomObjectです。

私は比較器の仕組みを誤解していると思います。私は間違っていますか? 2つの整数値をどのように比較すればよいですか?ちょうど私が実際に何をしようとしている明確にする

EDIT

...

私はCustomObjectにリンクされている整数を比較したいです。これらの整数は一意ではない可能性があるため、鍵を整数にすることはできません。私は彼らの整数値に基づいて降順で私のコレクションを並べ替えたいので、それらを比較することでした。

+0

例外がスローされるコードはどこですか? – SJuan76

+0

問題は、マップ用のコンパレータが値ではなくキーを比較することです。私はあなたの問題を解決するために逆マップを行うことはできません。その後、その結果をLinkedHashMapに挿入します。 – fge

+0

@ SJuan76それを反映するようにコードを更新しました – Skizit

答えて

5

あなたはIntegersCustomObject Sを比較するために、あなたのコンパレータを変更する必要はありません。

class Compare implements Comparator<CustomObject>{ 
    Map<CustomObject,Integer> map; 
    /** 
    * Constructs our map 
    * @param map map to be sorted. 
    */ 
    public Compare(Map<CustomObject,Integer> map){ 
     this.map = map; 
    } 
    /** 
    * Performs the comparison between two entries. 
    */ 
    public int compare(CustomObject left, CustomObject right){ 
     return map.get(left).compareTo(map.get(right)); 
    } 
} 

次に、あなたがあなたのコンパレータを使用するようにTreeMapを指示する必要があります:

private Map<CustomObject,Integer> Tmap = 
    new TreeMap<CustomObject,Integer>(new Compare(HMap)); 
+0

しかし..それらのキー(CustomObjects)でないInteger値を比較する必要があります – Skizit

+1

@Skizit:それで、コンパイラで 'map.get'を呼び出す理由です。これは、 'CustomObject'に対応する整数値を取得します。その結果、 'CustomObject'は対応するInteger-valuesによって順序付けられます。 –

0

まず薄いのことですキーはIntegerであり、値はCustomObjectでなければならず、次にHashMapはコンパレータに基づいてソートされます。しかし、HashMapのデフォルトでは、CustomObjectをソートする必要がある場合、CustomObjectをComparableに実装し、HashMapをCustomObjectに基づいてソートするようにcompareメソッドを記述する必要があります。あなたがこれを理解していれば。あなたの自己試してみてください。あなたが私に例を挙げて説明したければ、私はそれをやることができます。

質問が混乱しています。

1
new TreeMap<..>(new Compare<..>(map)) 

ツリーを構築するときにコンパレータを指定する必要があります。それ以外の場合は、あなたのキーが匹敵しているとみなします(そしてそうではありません)。

check this answer値に基づいてマップをソートします。

1

このアプローチにはいくつかの問題があります。

  • TreeMapは重複を無視します(compareToが0を返す)場合は、減少する整数値だけが追加されます。番号を任意の順序で指定できるように修正できますが、値が重複するエントリは削除されます。
  • compareToで使用されているフィールドは、コレクションを変更したり破損したりすることはできません。
  • 値を検索するには、キー全体を知る必要があります。この場合、それを探すためにこの場合の値を知る必要がありますが、これはあまり有用ではないかもしれません。

あなたは、これは重複を可能にし、注文されたとして、あなたが並べ替えることができますmap.entrySet()からList<Entry<CustomObject,Integer>>を作成したほうが良いです。

1

私は問題があなたが間違ったTreeMapコンストラクタを使用していると思います。使用しているキーは、すべてのキーがComparableを実装するクラスのインスタンスである必要があります。あなたのCustomObjectはありません。 Comparatorパラメーターを取るコンストラクターを使用する必要があります。例えば

TreeMap<CustomObject,Integer> tmap = 
    new TreeMap<CustomObject,Integer>(new Compare()); 

また、これはあなたの比較クラスがComparator<CustomObject>ないComparator<Integer>を実装する必要があることを教えてくれます。

もう1つの問題は、コンパレータが正しいセマンティクスを実装していないことです。比較メソッドは、arg1の場合は-ve numberを返します。<の場合はarg2、arg1 = arg2の場合はゼロ、arg1> arg2の場合は+ veの数です。例えば

public int compare(CustomObject one, CustomObject two){ 
    return Integer.compare(map.get(one), map.get(two)); 
} 

そしてこれさえ怪しいです:

  • 同じ整数にマップする任意の2つのCustomObjectインスタンスが等しいとして扱われ、あなたが(明確なとしての両方を持ってすることはできません場合)キーをTreeMapに挿入します。

  • mapに入力がない場合、コンパレータはNPEを返します。oneまたはtwoです。

1

整数でインデックス付けされたマルチマップを使用することをお勧めします。オブジェクトによってこれらのペアをルックアップする機能を保持する必要がある場合、両方のマップを維持することができます。 Javaにはマルチマップが付属していませんが、簡単なソリューションがあります。 HereMap<Integer,List<Object>>の例です(マルチマップセクションまでスクロールします)。

関連する問題