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