T オブジェクトで構成された PriorityQueue があり、T に compareTo() メソッドがあり、同等のものを実装しているが、PriorityQueue もコンパレーターをパラメーターとして受け取る場合、PriorityQueue はその要素の順序付けのために何を調べますか?
つまり、オブジェクトの優先度を決定するのはどれですか? compareTo() メソッドまたは提供されたコンパレータ?
T オブジェクトで構成された PriorityQueue があり、T に compareTo() メソッドがあり、同等のものを実装しているが、PriorityQueue もコンパレーターをパラメーターとして受け取る場合、PriorityQueue はその要素の順序付けのために何を調べますか?
つまり、オブジェクトの優先度を決定するのはどれですか? compareTo() メソッドまたは提供されたコンパレータ?
標準の PriorityQueue の場合、 を使用して構築するとComparator<T>
、優先度が決まります。そうでない場合は、Comparable<T>
が決定します。これはすべて、PriorityQueue APIで詳しく説明されています
comparator
コンストラクターのパラメーターのドキュメントには、次のように記載されています
comparator
- このプライオリティ キューの順序付けに使用されるコンパレータ。null の場合、順序は要素の自然な順序に依存します。
これは、acomparator
が指定されている場合、メソッドによって確立された自然順序付けcompareTo
が無視されることを意味します。
私はクラスのOracleの実装のソースコードをPriorityQueue
読んでいます.Comparatorが使用されているかどうかをチェックし、それを最初に使用しています。それ以外の場合は、Comparable オブジェクトを使用します。
Comparable はコレクション内のクラスの自然な順序を定義し、 Comparator は異なる順序を提供できるようにします。別の Comparator を提供することにした場合、それは自然順序をオーバーライドします。コンパレータを入力しないことで、compareTo メソッドで設定された自然順序に戻ります。