複数のソートの定義

各科目の点数でソートする

次のようなデータを最後の総計でソートしていましたが、それぞれの科目に注目してソートすることも簡単にできます。

n1001	65	67	56	70	42	300
n1002	35	39	38	32	34	178
n1003	55	80	40	72	59	306
n1004	52	86	61	75	61	335
n1005	63	72	65	53	59	312
n1006	44	50	52	50	47	243
n1007	45	57	59	45	35	241
....

1科目目で

1科目目の点数の降順(大きい順)で並べ替えるクラス(コンパレーター)です。クラス名を別のものにすることで総計の並べ替えと併存させることができます。

class Ten1Comp implements Comparator<OokiiJun42>{
    public int compare(OokiiJun42 x, OokiiJun42 y) {
         return y.ten1 - x.ten1;
    }
}

2科目目で並べ替えるなら次のように書きます。

class Ten2Comp implements Comparator<OokiiJun42>{
    public int compare(OokiiJun42 x, OokiiJun42 y) {
         return y.ten2 - x.ten2;
    }
}

プログラムの中でのソート部分

1科目目でソートしたければ、

Arrays.sort(jtable, 0, ct,new Ten1Comp());

2科目目でソートしたければ、

Arrays.sort(jtable, 0, ct,new Ten2Comp());

です。

結果

n1084 82 78 80 82 80 402
n1076 81 65 76 54 71 347
n1301 81 86 92 92 78 429
n1387 80 73 56 71 53 333
n1927 80 87 100 72 77 416
n2001 79 88 84 87 78 416
n1188 76 67 68 55 52 318
n1798 76 73 72 76 62 359
n1614 75 78 72 71 67 363
n1782 75 65 83 78 64 365

n1939 27 14 33 35 29 138
n1728 27 50 44 36 19 176
n1680 25 28 38 28 30 149
n2080 25 19 41 48 28 161
n1921 25 31 56 36 30 178
n1352 24 51 56 49 42 222
n1819 23 37 36 17 18 131
n1380 23 27 33 28 24 135
n1808 17 24 29 21 18 109
n1260 15 30 40 24 26 135

課題

1.

プログラム名 OokiiJun43.java

まず、OokiiJun42をコピーしてOokiiJun43とし、プログラム中の OokiiJun42 をすべて OokiiJun43 にします。

上記を参考にしながら、ten1 でソートするようにしてできることを確認しなさい。

次のように加える部分の42も43にすることを忘れずに。

class Ten1Comp implements Comparator<OokiiJun43>{
    public int compare(OokiiJun43 x, OokiiJun43 y) {
         return y.ten1 - x.ten1;
    }
}

2.

プログラム名 OokiiJun43.java (追加)

1.にさらに機能を加えます。

上記を参考にしながら、さらに、ten2, ten3, ten4, ten5 でソートするためのクラス(コンパレータ)も加えます。

コマンドラインから

java OokiiJun43 1

とすれば ten1 でソート

java OokiiJun43 2

とすれば ten2 でソート

などと 5科目のすべてでソートでき、

java OokiiJun43 s

とすれば soukei でソートするプログラムにしなさい。

注 1~5 は整数に変換する必要はなく、文字として if (args[0]=="1") などと比較すればよい。

Stringは単純変数でなくクラスの扱いなので if (args[0].equals("1")) などとしなければなりません。equalsを参照

あるいは、soukeiでソートする場合のsをやめて、これも 0 とか 6 とかにすれば、整数に直して比較できます。その場合は前にも出てきていますが、if (Integer.parseInt( args[0] == 1) とします。

s をやめるついでに、「引数無し」ならsoukeiでソートするというのもおもしろいかも知れません。if (args.length == 0 ) が引数がない時になります。

もくじ

聖愛高等学校
http://www.seiai.ed.jp/
Last Modified