5人の学生を 身長・体重で ソート (関数ポインタ)

明解C言語 入門編 > 12. 構造体 >

5人の学生を 身長・体重で ソート (関数ポインタ)

Java
class Lesson097 {
    static final int NINSU = 5;

    public static void main(String[] args) {
        CStudent[] data = new CStudent[NINSU];
        data[0] = new CStudent("Sato",    178, 61.0);
        data[1] = new CStudent("Sanaka",  175, 60.5);
        data[2] = new CStudent("Takao",   173, 80.0);
        data[3] = new CStudent("Mike",    165, 72.0);
        data[4] = new CStudent("Masaki",  179, 77.5);

        System.out.println("ソート前:");
        for (int i = 0; i < NINSU; i++)
            System.out.printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight);
        System.out.println("");

        sort(data, NINSU, new IStudentCompare(){public int compare(CStudent x, CStudent y) {if (x.height > y.height) return 1; if (x.height < y.height) return -1; return 0;}});

        System.out.println("身長でソート後:");
        for (int i = 0; i < NINSU; i++)
            System.out.printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight);
        System.out.println("");

        sort(data, NINSU, new IStudentCompare(){public int compare(CStudent x, CStudent y) {if (x.weight > y.weight) return 1; if (x.weight < y.weight) return -1; return 0;}});

        System.out.println("体重でソート後:");
        for (int i = 0; i < NINSU; i++)
            System.out.printf("%2d:%-8s%4d%6.1f\n", i + 1, data[i].name, data[i].height, data[i].weight);
    }

    static void sort(CStudent data[], int n, IStudentCompare stdComp) {
        int k = n - 1;
        while (k >= 0) {
            int j = -1;
            for (int i = 1; i <= k; i++) {
                if (stdComp.compare(data[i - 1], data[i]) > 0) {
                    j = i - 1;
                    CStudent tmp = data[i];
                    data[i]      = data[j];
                    data[j]      = tmp;
                }
            }
            k = j;
        }
    }
}

class CStudent {
    public String name;
    public int    height;
    public double weight;

    public CStudent(String name, int height, double weight) {
        this.name   = name;
        this.height = height;
        this.weight = weight;
    }
}
interface IStudentCompare {
  int compare(CStudent x, CStudent y);
}

実行結果

L:\>java Lesson097
ソート前:
1:Sato 178 61.0
2:Sanaka 175 60.5
3:Takao 173 80.0
4:Mike 165 72.0
5:Masaki 179 77.5

身長でソート後:
1:Mike 165 72.0
2:Takao 173 80.0
3:Sanaka 175 60.5
4:Sato 178 61.0
5:Masaki 179 77.5

体重でソート後:
1:Sanaka 175 60.5
2:Sato 178 61.0
3:Mike 165 72.0
4:Masaki 179 77.5
5:Takao 173 80.0