はじめまして。
質問をさせていただきます。
以下のソースで、
===============================================================
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
================================================================
偶数が最初に昇順で出力され、奇数が後から昇順で出力されている
のですが、なぜこのような実行結果になるのかがわかりません。
どうかご教授お願いします。
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.同じなら数の大小で並び替え
ということになります。
ngsvx様へ
ご回答ありがとうございました。
なぜ実行結果のようになったのかとか、
compareメソッドの使い方まで
ご教示していただきまして
ありがとうございました。
とてもわかりやすかったです。
今後は質問のタイトルを
適切につけるようにします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Visual Basic(VBA) vbaの計算 if elseと範囲について 6 2022/11/26 01:49
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) エクセルVBAで以下のようなコードを書いたらエラーになりました。何処が間違っているの教えて? 1 2023/02/10 18:30
- Java Java 配列<選挙> 4 2023/07/31 15:07
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「例外 *** は対応する try 文...
-
setAttribute(String, int)は適...
-
eclipseに記述したjavaファイル...
-
生年月日と今日の日付から年齢...
-
HTMLでのTableタグデータ取得方法
-
スタイルシートが適用されない。
-
<forEach> 内で供給された "ite...
-
jFrameを使って複数の画面を生...
-
文字サイズが可変のラベル
-
「1」などの数字を「January」...
-
NetBeansでのJButtonの配列化
-
フレームの×ボタンを押しても閉...
-
C言語のポインターに関する警告
-
System.err. printlnとSystem.o...
-
ダブルクォーテーションのrepla...
-
JSPやサーブレットでSystem.out...
-
ループ処理の際、最後だけ","を...
-
1~100までの数字を表示し、か...
-
べき乗
-
[JAVA]try 内の変数を外で!?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
eclipseに記述したjavaファイル...
-
「例外 *** は対応する try 文...
-
干支の計算で。。。
-
Selenium IDEでexportしたコー...
-
Javaを使ってデジタル時計を作...
-
ColabでのPytorchのエラー
-
importするには java.io.*; imp...
-
生年月日と今日の日付から年齢...
-
ファイル名を動的に生成したい
-
文字列を数式に
-
<forEach> 内で供給された "ite...
-
シャットダウンフックが呼ばれない
-
Javaからストアド実行(配列項目)
-
ActionForm form にnullが入っ...
-
setAttribute(String, int)は適...
-
(急募)JavaカレンダーをGUI可に...
-
文字サイズが可変のラベル
-
Java での グローバルIP取得
-
python OpenPyXLを使って出力結...
-
データの外挿について
おすすめ情報