プロが教える店舗&オフィスのセキュリティ対策術

はじめまして。
質問をさせていただきます。
以下のソースで、
===============================================================
import java.util.Comparator;
import java.util.TreeSet;
import java.util.Iterator;

final class Demo
{
public static void main(String[] args)
{
TreeSet<Integer> set =
new TreeSet<Integer>(new Comparator<Integer>()
{
public int compare(Integer i,Integer j)
{
int result = i%2 - j%2;
if(result==0)
{
result = i-j;
}
return result;
}
});

for(int i=0;i<10;i++)
{
set.add(10-i);
}

Iterator<Integer> it = set.iterator();
while(it.hasNext())
{
System.out.println((Integer)it.next());
}

}
}
================================================================
実行結果
================================================================
2
4
6
8
10
1
3
5
7
9
================================================================
偶数が最初に昇順で出力され、奇数が後から昇順で出力されている
のですが、なぜこのような実行結果になるのかがわかりません。
どうかご教授お願いします。

A 回答 (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.同じなら数の大小で並び替え

ということになります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/11/08 12:45

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!