- ベストアンサー
java.util.Comparatorのcompareメソッドの振る舞いについて
- Javaプログラムで、java.util.Comparatorのcompareメソッドの振る舞いについて教えてください。
- ソースコードの実行結果を見ると、偶数が最初に昇順で出力され、奇数が後から昇順で出力されています。なぜこのような結果になるのか理解できません。
- ご教授いただけると幸いです。
- みんなの回答 (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.同じなら数の大小で並び替え ということになります。
お礼
ngsvx様へ ご回答ありがとうございました。 なぜ実行結果のようになったのかとか、 compareメソッドの使い方まで ご教示していただきまして ありがとうございました。 とてもわかりやすかったです。 今後は質問のタイトルを 適切につけるようにします。