データをセットで扱いたい
“名前:国語点数:数学点数”のテキストデータがあります。
1 2 3 4 5 |
"佐藤:12:45" "鈴木:20:45" "高橋:55:19" "田中:43:76" "伊藤:39:55" |
これを成績順で並べるプログラムを途中まで作ってみました。途中までなのはやる気が失せたからです。とても人様に見せるプログラムではありません・・・
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package jp.ayax; public class Main { static String[] str = { "佐藤:12:45", "鈴木:20:45", "高橋:55:19", "田中:43:76", "伊藤:39:55" }; static String[] name = new String[str.length]; static int[] kokugo = new int[str.length]; static int[] suugaku = new int[str.length]; static final int KOKUGO = 1; static final int SUUGAKU = 2; public static void main(String[] args) { // TODO 自動生成されたメソッド・スタブ split(); sort(KOKUGO); sort(SUUGAKU); print(); } public static void split(){ System.out.println("文字列を分割して配列へ格納"); } public static void sort(int flg){ System.out.println("引数に応じて国語、数学の点数順にソート"); } public static void print(){ System.out.println("配列内容に沿って、名前:点数:点数を表示"); } } |
このプログラムの一番納得のできないところは、11行目~13行目です。
11 12 13 |
static String[] name = new String[str.length]; static int[] kokugo = new int[str.length]; static int[] suugaku = new int[str.length]; |
名前、国語の点数、数学の点数用の配列をそれぞれ定義しています。本来ならば名前と各点数はセットで管理すべきなのですが、それぞれ別の配列になっています。単純なプログラムではなんとかなりますが、複雑さが増してくるとセットで管理できないためプログラムが煩雑になるでしょう。
実はプログラム言語によってはデータをセットで扱う命令が用意されています。例えば次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
Type student name As String kokugo As Integer suugaku As Integer End Type sub macro() Dim students[10] As student students[0].name = "佐藤" students[0].kokugo = 12; students[0].suugaku = 45; students[1].name = "鈴木"; ・ ・ End sub |
1行目~5行目でType命令によりデータセットstudentを定義しています。このデータセットの定義を使い、8行目で配列変数(students)を宣言し、各データへアクセスしています。
Javaにはクラスがある
Javaはデータをセットで定義するType命令が存在しません。その代わりにclassを使用します。「classって処理を記述する際の宣言じゃないの?」と思われたなら「classはデータをセットで定義する命令である。たまーに処理を書く」と思ってください。こちらの方がスッキリとするはずです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
package jp.ayax; public class Main { static String[] str = { "佐藤:12:45", "鈴木:20:45", "高橋:55:19", "田中:43:76", "伊藤:39:55", }; static final int KOKUGO = 1; static final int SUUGAKU = 2; public static void main(String[] args) { Student[] students = new Student[str.length]; split(students); sort(KOKUGO,students); print(students); } public static void split(Student[] students){ for(int i=0;i<str.length;i++){ Student s = new Student(); String[] b = str[i].split(":",0); s.name = b[0]; s.kokugo = Integer.parseInt(b[1]); s.suugaku = Integer.parseInt(b[2]); students[i] = s; } } public static void sort(int flg,Student[] students){ System.out.println("引数に応じて国語、数学の点数順にソート"); } public static void print(Student[] students){ System.out.println("配列内容に沿って、名前:点数:点数を表示"); } } class Student { String name; int kokugo; int suugaku; } |
38行目~42行目でクラスStudentを定義しました。これで名前、各点数をセットで扱うことができます。
48 49 50 51 52 |
class Student { String name; int kokugo; int suugaku; } |
11行目で定義したstudentを配列化し変数studentsに格納しています。※配列studentsは配列の個数を宣言しただけなので各配列の内容は何も定義されていません。
11 |
Student[] students = new Student[str.length]; |
Student[]は配列宣言ですが、classはデータセットの定義だとイメージすればこの配列化も理解しやすいと思います。また、可変配列のArrayListでも次のようにクラスを使うことができます。
21行目~28行目で文字列データから配列studentsへデータを格納しています。22行目で1件分のデータセットを作り、各項目へ値を設定し、27行目で配列に格納しています。
21 22 23 24 25 26 27 28 |
for(int i=0;i<str.length;i++){ Student s = new Student(); String[] b = str[i].split(":",0); s.name = b[0]; s.kokugo = Integer.parseInt(b[1]); s.suugaku = Integer.parseInt(b[2]); students[i] = s; } |
クラスによりデータをセットで扱うことができました。少しだけ見られるプログラムになりましたが、まだまだ納得がいかないところがありますが、次にすすみましょう。