• ベストアンサー

compareToにおける「自然順序付け」

「自然順序付け」という言葉の意味が分かりません。 回答をよろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 もう一息。  先の回答で、hitoクラスの例を挙げました。  ところで、もし、「hitoクラスの大小を比較しなさい。」とだけ言われたら、システムに正しい判断が出来ると思いますか?  無理です。身長順が正解で体重順が間違いなんて、システムに解るはずがありません。  これが、intや、stirngクラスなら、システムにも解ります。(文字列は、国際化がらみで少々面倒なところはありますけれどもね。)  基本的に、基本型以外では、システムは、正しい大小関係を自分で判断することは出来ません。  ところが、例えば、arrayクラスに定義されているsortメソッドでは、sort(object a[])のようにクラスだけを引数として取るメソッドが定義されています。  このオブジェクトの正しいソート順序はなんなのか?この場合に、システムはどうやって、オブジェクトの大小関係を判断しているのか?  というテーマの問題です。  他にも、デフォルトの大小比較を要求するメソッドはいろいろあります。  このようなとき、デフォルトで使われる大小関係を自然順序づけと呼びます。  もちろん、この自然順序づけは勝手にどこかからわいてくるわけではありません。  クラスの自然順序づけを定義してみるなら、  public interface Comparable<T> を実装しているクラスにおいて、メソッドcompareToで定義されている順序を自然順序づけと呼ぶ。  となります。  compareToでどのような結果を出すかは、クラスを作成したプログラマの自由です。一貫性のある答えを出せば、どんな順序を定義しても大丈夫です。大きい順でも小さい順でも、はたまた、仕様書に書かれた摩訶不思議な順序定義表に基づくものでもかまいません。どんなに不自然に見える順序であっても、この関数に書かれた順序が自然順序です。  裏を返せば、Comparable<T>を実装していないクラスの大小関係は、大小関係を必要とするメソッドにおいて、コンパレーターを引数として渡してあげないと、判定できませんということです。

taro_11
質問者

お礼

>>mitoneko様 返信が遅くなり申し訳ありませんでした。 ようやく「自然順序」についての意味を理解することが出来ました。 ありがとうございます。 参考書ももっと具体的に説明して欲しいものです…。

その他の回答 (1)

  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 単なる言葉の定義です。  とあるクラスにおいて、compareToメソッドが定義されている時、このcompareToが返す順序が、このクラスの自然順序づけになるというだけのことです。  あえて、意味を求めるなら、たいていの比較において、このcompareToに定義されている順序がデフォルトで(また、強制的に)使用されるという意味合いでしょうか。  例えば、クラスhitoが定義されているとします。この順序付けはいろいろと考えられます。身長順、体重順、年齢順・・・などなど。ここで、compareToには、身長で比較する実装をしたとします。そうすると、比較を行ういろいろなルーチンでは、通常、身長順で並べることになります。  でも、クラスには、体重順で比較するcompareTaijyuuToをなんてメソッドを定義することも出来ます。この比較も当然有効です。ただし、このメソッドは、特に指定した時にしか使用されません。これが、自然順序づけの「自然」の意味するところと考えてもよいでしょう。

taro_11
質問者

補足

>>mitoneko様 具体的な例を交えての説明をありがとうございます。 私の質問の仕方が不適切でした。申し訳ありません。 今、javaの基礎を勉強しております。解説書にはよく「自然順序」という言葉が出て来ますが、 その定義に関する説明がありません。 プログラマーが順序を定義しない場合、つまりおおまかな意味合いでは、数字なら小さい値から 大きい値、アルファベットならaからzへという感じなのでしょうか。

関連するQ&A