• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:java.util.Comparatorのcompareメソッドの振る舞いについて)

java.util.Comparatorのcompareメソッドの振る舞いについて

このQ&Aのポイント
  • Javaプログラムで、java.util.Comparatorのcompareメソッドの振る舞いについて教えてください。
  • ソースコードの実行結果を見ると、偶数が最初に昇順で出力され、奇数が後から昇順で出力されています。なぜこのような結果になるのか理解できません。
  • ご教授いただけると幸いです。

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

  • ベストアンサー
  • ngsvx
  • ベストアンサー率49% (157/315)
回答No.1

質問のタイトルを見ると、Comparator#compareメソッドの一般的な使用法のように受け取れますが、 内容を見るとサンプルの処理内容が質問のようにもとれ、 どちらかわかないので両方回答しておきます。 次回からは、タイトルは適切につけて下さい。 無意味な回答になることもありますので。 並び替えを行うには、各項目間の大小関係を取得する必要があります。 Comparator#compareメソッドはそれを定義するものです。 compare(a,b)であるとき、 a>bであるなら正の整数 a<bであるなら負の整数 a=bであるなら0 を返します。 ソートなどのプログラムは、正の整数が返されたときにはaとbの位置を入れ替えます。 3,2,1というデータの場合、 3,2を比較->正の整数->入れ替え->2,3,1 3,1を比較->正の整数->入れ替え->2,1,3 2,1を比較->正の整数->入れ替え->1,2,3 ソート終了 となります。 この例はバブルソートというものでjavaのソートの実装とは異なりますが、 compareの使い方に関しては同じです。 今回のサンプルを解説すると、 int result = i%2 - j%2; は2で割った余りを引き算しています。 この処理で変数resultは、 i、jが偶数同士又は奇数同士のときには0 iが偶数、jが奇数なら-1 iが奇数、jが偶数なら 1 となります。 次に、 if(result==0) { result = i-j; } ですが、変数resultが0の場合というのは、 i、jが偶数同士又は奇数同士のときで、 そのときに、iとjの大小比較をしています。 i>jなら正の整数 i<jなら負の整数 i=jなら0 全部をまとめると、 iが偶数、jが奇数なら負の整数 iが奇数、jが偶数なら正の整数 i、jが偶数同士又は奇数同士のとき、  i>jなら正の整数  i<jなら負の整数  i=jなら0 となります。 つまり、 1.まず偶数か奇数かで並び替え 2.同じなら数の大小で並び替え ということになります。

tyorotyoro123
質問者

お礼

ngsvx様へ ご回答ありがとうございました。 なぜ実行結果のようになったのかとか、 compareメソッドの使い方まで ご教示していただきまして ありがとうございました。 とてもわかりやすかったです。 今後は質問のタイトルを 適切につけるようにします。