มาใช้ Array เก็บข้อมูลคนละชนิดกัน ในภาษา Java
มาเขียนถึงเรื่อง Array ในภาษา Java อีกครั้ง โดยทั่วไปการใช้ array เก็บข้อมูลนั้น ลักษณะของข้อมูลที่เก็บจะต้องเป็นชนิดเดียวกัน แต่ถ้าปัญหาต้องการเก็บข้อมูลคนละชนิดกัน ทำอย่างไร ดูปัญหาก่อน ว่าบังคับให้ใช้ array ตัวเดียวกันไหมถ้าไม่ทำง่าย ๆ ก็เก็บ ข้อมูลแต่ละชนิดไว้ใน array แต่ละตัว
ตัวอย่างแรกแบบง่าย ๆ ก่อน สมมุติปัญหา ต้องการอ่านชื่อ นศ. และคะแนนสอบของแต่ละคน สมมุติมี นศ. 2 คน แต่ละคนสอบ 2 วิชา ใช้ array แบบ 1 มิติ
import java.util.Scanner;
class prac03
{
static final int MAX_N=2;
static final int MAX_S=2;
public static void main(String[] args)
{
String name[] = new String[MAX_N];
int sj1[] =new int[MAX_S];
int sj2[] =new int[MAX_S];
readName(name);
readSj(sj1,sj2);
System.out.printf("%10s%10s%10sn","Name","Subject1", Subject2");
for(int i=0;i<name.length;i++){
System.out.printf("%10s%10d%10dn",name[i], sj1[i],sj2[i]);
}//end for
} //end main
static void readName(String n[])
{
Scanner input = new Scanner( System.in );
for(int i=0;i<n.length;i++){
System.out.printf( "Enter Student # %d's name: ",i ); // prompt
n[i] = input.nextLine(); // read
}//end for
}//end method
static void readSj(int s1[],int s2[])
{
Scanner input = new Scanner( System.in );
for(int i=0;i<s1.length;i++){
System.out.printf( "Enter Subject 1's student #%d score: ", i );
s1[i] = input.nextInt(); // read
System.out.printf( "Enter Subject 2's student #%d score: ", i);
s2[i] = input.nextInt(); // read
}//end for
}//end method
} //end class
ผลการวิ่ง (Run) โปรแกรม
Enter Student # 0's name: aa
Enter Student # 1's name: bb
Enter Subject 1's student #0 score: 11
Enter Subject 2's student #0 score: 22
Enter Subject 1's student #1 score: 33
Enter Subject 2's student #1 score: 44
Name Subject1 Subject2
aa 11 22
bb 33 44
จะเห็นว่าไม่ยุ่งยาก ลองสมมุติใหม่ สมมุติว่ามี นศ. 3 คน แต่ละคนสอบ 2 วิชา ใช้ array แบบ 1 มิติ (จากเดิม 2 คน เป็น 3 คน)
import java.util.Scanner;
class prac03_2
{
static final int MAX_N=3;
static final int MAX_S=2;
public static void main(String[] args)
{
String name[] = new String[MAX_N];
int st0sj[] =new int[MAX_S];
int st1sj[] =new int[MAX_S];
int st2sj[] =new int[MAX_S];
readName(name);
readSj(st0sj,st1sj,st2sj);
System.out.printf("%10s%10s%10sn","Name","Subject1","Subject2");
System.out.printf("%10s",name[0]);
System.out.printf("%10d",st0sj[0]);
System.out.printf("%10dn",st0sj[1]);
System.out.printf("%10s",name[1]);
System.out.printf("%10d",st1sj[0]);
System.out.printf("%10dn",st1sj[1]);
System.out.printf("%10s",name[2]);
System.out.printf("%10d",st2sj[0]);
System.out.printf("%10dn",st2sj[1]);
} //end main
static void readName(String n[])
{
Scanner input = new Scanner( System.in );
for(int i=0;i<n.length;i++){
System.out.printf( "Enter Student # %d's name: ",i ); // prompt
n[i] = input.nextLine(); // read
}//end for
}//end method
static void readSj(int s0[], int s1[], int s2[])
{
Scanner input = new Scanner( System.in );
for(int i=0;i<s0.length;i++){
System.out.printf( "Enter student #0 Subject %d's score: ",i ); // prompt
s0[i] = input.nextInt(); // read
System.out.printf( "Enter student #1 Subject %d's score: ",i ); // prompt
s1[i] = input.nextInt(); // read
System.out.printf( "Enter student #2 Subject %d's score: ",i ); // prompt
s2[i] = input.nextInt(); // read
}//end for
}//end method
} //end class
ผลการวิ่ง (Run) โปรแกรม
Enter Student # 0's name: aa
Enter Student # 1's name: bb
Enter Student # 2's name: cc
Enter student #0 Subject 0's score: 11
Enter student #1 Subject 0's score: 22
Enter student #2 Subject 0's score: 33
Enter student #0 Subject 1's score: 44
Enter student #1 Subject 1's score: 55
Enter student #2 Subject 1's score: 66
Name Subject1 Subject2
aa 11 44
bb 22 55
cc 33 66
สังเกตว่าเริ่มจะยุ่งยากแล้ว หลาย ๆ อย่างไม่ได้เป็นไปตามที่คิดเหมือนตัวอย่างแรก การอ่านค่าหรือการแสดงผลเริ่มสับสน และใช้ตัวแปรใน index ของ array ไม่ได้
ลองเปลี่ยนรูปแบบข้อมูลใหม่โดยใช้ array 2 มิติมาช่วย
import java.util.Scanner;
class prac03_1
{
static final int STUDENT=3;
static final int SUBJECT=2;
public static void main(String[] args)
{
String name[] = new String[STUDENT];
int sj1[][] =new int[STUDENT][SUBJECT];
int i;
readName(name);
for(i=0;i<name.length;i++)
readSj(sj1[i],i+1);
System.out.printf("nn%10s%10s%10s","Name","Subject1","Subject2");
System.out.println();
for(i=0;i<name.length;i++){
System.out.printf("%10s",name[i]);
for(int j=0;j<sj1[i].length;j++){
System.out.printf("%10d",sj1[i][j]);
}//end for j
System.out.println();
}//end for i
} //end main
static void readName(String n[])
{
Scanner input = new Scanner( System.in );
for(int i=0;i<n.length;i++){
System.out.printf( "Enter Student # %d's name: ",i+1 ); // prompt
n[i] = input.nextLine(); // read
}//end for
}//end method
static void readSj(int s1[],int sjName)
{
Scanner input = new Scanner( System.in );
for(int i=0;i<s1.length;i++){
System.out.printf( "Enter student #%d Subject %d's score: ",sjName,i+1 );
s1[i] = input.nextInt(); // read
}//end for
}//end method
} //end class
ผลการวิ่ง (Run) โปรแกรม
Enter Student # 1's name: aa
Enter Student # 2's name: bb
Enter Student # 3's name: cc
Enter student #1 Subject 1's score: 11
Enter student #1 Subject 2's score: 22
Enter student #2 Subject 1's score: 33
Enter student #2 Subject 2's score: 44
Enter student #3 Subject 1's score: 55
Enter student #3 Subject 2's score: 66
Name Subject1 Subject2
aa 11 22
bb 33 44
cc 55 66
· จะเห็นได้ว่าเมื่อใช้ array แบบ 2 มิติทำให้เขียนโปรแกรมและจัดการโปรแกรมได้ง่ายขึ้น
· ให้ลองเปลี่ยนรูปแบบใหม่โดยใช้ object จะทำให้การใช้งานได้ง่ายกว่านี้
· ถ้าปัญหาเปลี่ยนใหม่ ให้มีการเก็บ Section ของนศ. มีการเก็บชื่อสาขา …. เขียนและออกแบบโครงสร้างข้อมูลอย่างไร