お題
5点満点のテストがある。これを9人が受けたときの結果に対して順位付けをせよ。なお、9人の点数はランダムとする。
実行例
[実行例1]
***テストの点数***
[4, 1, 3, 5, 0, 0, 4, 2, 2]
***順位***
[2, 7, 4, 1, 8, 8, 2, 5, 5]
[実行例2]
***テストの点数***
[0, 0, 4, 5, 0, 1, 0, 5, 5]
***順位***
[6, 6, 4, 1, 6, 5, 6, 1, 1]
点数が同じ人は同一の順位になっていることに着目してもらい。
考え方
①すべてのデータに対して、それよりも点数の多い人の人数を数える(わかりやすさ優先)
これがもっとも単純な考え方だ。1つのデータとすべてのデータを比較し、そのデータよりも大きい人の数を数える方法だ。
import java.util.Arrays;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rand = new Random();
//点数用の配列
int[] data = new int[9];
//ランダムな点数を入れる
for(int i=0;i<data.length;i++) {
data[i] = rand.nextInt(10);
}
//表示
System.out.println("***テストの点数***");
System.out.println(Arrays.toString(data));
//結果用の配列
int[] results = new int[data.length];
//とりあえず全員1位にしておく
for(int i=0;i<results.length;i++) {
results[i]=1;
}
//最初の人から最後の人まで回すループ
for(int i=0;i<data.length;i++) {
//すべてのデータと比較するためのループ
for(int j=0;j<data.length;j++) {
//もし大きい点数があったら
if(data[i] < data[j]){
//順位が一つ下がる
results[i]++;
}
}
}
//表示
System.out.println("***順位***");
System.out.println(Arrays.toString(results));
}
}
②基準点の人ととの比較を繰り返し、その都度順位を変動させていく(効率優先)
先程の方法はわかりやすのだが効率が悪い。効率の良い方法を考えみよう。
先程は、同じ人同士の比較を何度も繰り返すことになるのだが、以下の方法だと同じ人との比較は1度きりとなる。
import java.util.Arrays;
import java.util.Random;
public class Main {
public static void main(String[] args) {
Random rand = new Random();
//点数用の配列
int[] data = new int[9];
//ランダムな点数を入れる
for(int i=0;i<data.length;i++) {
data[i] = rand.nextInt(6);
}
//表示
System.out.println("***テストの点数***");
System.out.println(Arrays.toString(data));
//結果用の配列
int[] results = new int[data.length];
//とりあえず全員1位にしておく
for(int i=0;i<results.length;i++) {
results[i]=1;
}
//最初の人から最後の1人手前まで回すループ(基準点)
for(int i=0;i<data.length-1;i++) {
//基準点以降に対して回るループ
for(int j=i+1;j<data.length;j++) {
//もし基準点の点数が低かったら
if(data[i] < data[j]){
//基準点の順位が一つ下がる
results[i]++;
//基準点のほうが大きかったら
}else if(data[i] > data[j]){
//比較対象の順位を下げる
results[j]++;
}
}
}
//表示
System.out.println("***順位***");
System.out.println(Arrays.toString(results));
}
}
最初の方法は9*9の81回比較しているのに対し、この方法だと
8+7+6+5+4+3+2+1 =36回の比較で済んでいる。
データ数が多い場合などはこの計算量の差が大きくなってくるので、こちらの方法を用いたほうがよいだろう。
コメント