複数のフィールドからなるデータの並べ替え

javaらしくないやりかたで

数値だけがデータになっている例はまれで、普通は他のデータが組み合わされています。

データが受験番号と点数の組み合わせであったとします。

ファイル名 data22.txt

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
....

作戦

全体を動かして並べ替えるのは無駄。全体に番号を振りそれだけをデータと一緒にソートして一番大きいのはm番目、2番はn番目とこれを元に表示をする。

受験番号と点数のデータはどうせ全部よんで保持しなければならないので、全部を先に読んでしまいます。

int[][] tensuu というやり方もありますが、

jnum[] ten1[] ten2[] ten3[] ten4[] ten5[] data[]
n1001    65    67     56     70     42     300
....

とします。

この他にno[]を設けて、no[i]=i としておきます。

data[] を並べ替える時に。no[] も並べ替えます。

一番大きいデータがdata[3]で値が335だったとすればソート後、このデータはdata[0]に移動します。no[3]の元の内容は 3 で、これを一緒に並べ替えればno[0]が 3 になります。
これで一番大きいデータはdata[0]の335で、no[0]は 3 、その人のデータは、jnum[3] ten1[3] ten2[3] ten3[3] ten4[3] ten5[3] data[0] です。

最後のdata[]は並び替えられてしまっていますので注意。

配列の宣言の例

読み込むデータ数より多い要素をもつように宣言します

int[] ten1 = new int[1200];

文字列の場合は

String[] jnum = new String[1200];

splitを使った読み込みの例

int ct=-1; //本来は0から始めたいが配列の指数が0から始まるので
try {
    //String[] tmp = new String[7];
    String[] tmp ;  //要素数7で指定してもよいがなくても大丈夫
    String sep = "\t";
    FileReader   in  = new FileReader(fname);
    BufferedReader inb = new BufferedReader(in);
    String line;
    while ((line = inb.readLine()) != null) {
        tmp = line.split(sep);
        ct++;
        jnum[ct] = tmp[0];
        ten1[ct] = Integer.parseInt(tmp[1]);
        ten2[ct] = Integer.parseInt(tmp[2]);
        ten3[ct] = Integer.parseInt(tmp[3]);
        ten4[ct] = Integer.parseInt(tmp[4]);
        ten5[ct] = Integer.parseInt(tmp[5]);
        data[ct] = Integer.parseInt(tmp[6]);
        no[ct]   = ct;
    }
    inb.close();
    in.close();
}//もちろんcatchも必要

次のようにしてもよい。

int ct=0; //本来は0から始めたいが配列の指数が0から始まるので
try {
    //String[] tmp = new String[7];
    String[] tmp ;  //要素数7で指定してもよいがなくても大丈夫
    String sep = "\t";
    FileReader   in  = new FileReader(fname);
    BufferedReader inb = new BufferedReader(in);
    String line;
    while ((line = inb.readLine()) != null) {
        tmp = line.split(sep);
        jnum[ct] = tmp[0];
        ten1[ct] = Integer.parseInt(tmp[1]);
        ten2[ct] = Integer.parseInt(tmp[2]);
        ten3[ct] = Integer.parseInt(tmp[3]);
        ten4[ct] = Integer.parseInt(tmp[4]);
        ten5[ct] = Integer.parseInt(tmp[5]);
        data[ct] = Integer.parseInt(tmp[6]);
        no[ct]   = ct;
        ct++;
    }
    inb.close();
    in.close();
}//もちろんcatchも必要

ソート部分

選択、バブル、挿入、なにを使ってもよいが、data[] と同様の並び替えを no[] に対しても行う。

つまりdata[a]とdata[x]を取り替えたらno[a]とno[x]も取り替える

表示

最初の10件と最後の10件を表示する。(全部は見るのが苦しい)

n2026 75 94 84 88 96 437
n1121 68 92 100 90 82 432
n1632 71 82 96 89 94 432
n1453 61 93 96 90 91 431
n1301 81 86 92 92 78 429
n1297 68 86 100 89 82 425
n1457 66 94 100 91 73 424
n1127 73 82 100 80 88 423
n1327 75 93 92 74 89 423
n1490 62 97 92 86 85 422
n1795 72 87 96 91 76 422

n1169 36 18 33 28 20 135
n1177 45 29 12 26 23 135
n1260 15 30 40 24 26 135
n1380 23 27 33 28 24 135
n2063 32 17 45 18 21 133
n1293 29 12 44 29 18 132
n1819 23 37 36 17 18 131
n2017 53 14 25 19 15 126
n1914 42 15 25 20 22 124
n1956 29 11 25 16 37 118
n1808 17 24 29 21 18 109

課題

1.

プログラム名 OokiiJun31.java

上記のプログラムを完成させなさい

もくじ

Javaプログラミング
聖愛中学高等学校
http://www.seiai.ed.jp/
Dec.2003
Feb.2009
Dec.2011