13

重複の可能性:
Javaでマップのキーをソートするにはどうすればよいですか?

クラスTreeMapでは、Java API は次のように述べています。

赤黒木ベースの NavigableMap 実装。マップは、使用されるコンストラクターに応じて、キーの自然順序付けに従って、またはマップ作成時に提供される Comparator に従ってソートされます。

自然順序付けとは キーとして使用されるクラスはインターフェイスを実装する必要はありませんが、Comparable代わりにどの順序が使用されますか?

4

5 に答える 5

9

これを自分で試してみると、実装されていないTreeMapを持っているを使用できないことがわかります(コンストラクターを介して明示的に提供しない限り)。KComparableComparatorTreeMap

public class App 
{
    public static void main( String[] args )
    {
        TreeMap<App,String> tm = new TreeMap<App,String>();
        tm.put(new App(), "value");
    }
}

スレッド「メイン」の例外java.lang.ClassCastException:アプリをjava.lang.Comparableにキャストできません

のjavadocput()は、これを明示的に示しています。

スロー:
ClassCastException-指定されたキーを現在マップにあるキーと比較できない場合

「自然順序付け」のTreeMapのjavadocsのリンクから、Comparableインターフェイスに移動します

于 2012-12-30T01:53:45.487 に答える
5

「自然な」順序付けは、 でComparableキーとして使用されるオブジェクトによるインターフェイスの実装によって暗示される順序付けですTreeMap。基本的に、RBTree はどのキーが他のキーよりも小さいかを認識できなければならず、そのロジックを RBTree 実装に提供するには 2 つの方法があります。

  • 、またはComparableへのキーとして使用されるクラスにインターフェースを実装しますTreeMap
  • Comparatorキー クラス自体の外部で比較を行うの実装を提供します。
于 2012-12-30T01:44:40.203 に答える
4

を実装する必要がありますComparable。コンパイル時に強制されないだけです。

jamlong% cat Wah.java

import java.util.*; 

public class Wah {

    public static void main(String[] args) {
        TreeMap<Wah, Integer> wah = new TreeMap<Wah, Integer>(); 
        wah.put(new Wah(), 1); 
        wah.put(new Wah(), 2);
    } 
}

jamlong% java Wah

Exception in thread "main" java.lang.ClassCastException: Wah cannot be cast to java.lang.Comparable
    at java.util.TreeMap.put(TreeMap.java:542)
    at Wah.main(Wah.java:8)

疑わしい場合は、ソースを読んTreeMapでください。たとえば、541行目。

于 2012-12-30T01:56:15.453 に答える
2

Comparable自然順序付けは、インターフェイスによって提供される順序です。TreeMapなしでを作成することはできますがComparator、自然な順序を実装しないキーを配置しようとすると、がスローされClassCastExceptionます。

于 2012-12-30T01:55:17.900 に答える
0

自然順序付けはキーによって決定されます。

したがって、文字列を使用すると、1 つの順序が得られます。整数は別のものを与えます。

Comparable は要件だと思います。

于 2012-12-30T01:43:52.697 に答える