2. บทที่ 6 ตัวแปรอารเรย หนาที่ 142
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
เนื้อหาบทเรียน
♦ ตัวแปรอารเรย(array of local variable)
♦ สมาชิกอารเรย(array of attribute)
♦ อารเรยของคลาส(array of class)
♦ การสงผานขอมูลอารเรยระหวางเมธอด
♦ อารเรยหลายมิติ(multi dimensional array)
3. บทที่ 6 ตัวแปรอารเรย หนาที่ 143
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวแปรอารเรยคือ ตัวแปรชุดชนิด reference data type แบบพิเศษ ที่สามารถเก็บขอมูลชนิด
เดียวกันไดหลายคา เปนชุดของขอมูลที่มีประเภทเดียวกัน เชน ขอมูลคะแนนสอบของนักเรียน 15 คน
ขอมูลอุณหภูมิของชวงหกโมงเย็นใน 1 เดือน ขอมูลปริมาณน้ําฝนใน 1 ป เปนตนเราสามารถ
ประยุกตใชตัวแปรอารเรยชวยจัดการกับขอมูลดังกลาวเพื่อนํามาประมวลผลตอไป เชนใชในการหา
คาเฉลี่ยของปริมาณน้ําฝนในรอบ 12 เดือน เก็บขอมูลนิสิตสาขาวิทยาการคอมพิวเตอร เปนตน ซึ่งสา
มาชิกของอารเรยอาจเปนตัวแปรพื้นฐาน(Primitive Data Types)หรือตัวแปรอางอิง(Reference Data
Types)ก็ได จํานวนสมาชิกของอารเรยมีขนาดแนนอนไมสามารถเปลี่ยนแปลงขนาดได และสมาชิก
ของอารเรยแตละตัวจะมีลําดับประจําตัวอยู
อารเรยในภาษาจาวาเปนวัตถุ ดังนั้นจึงเปนการดีที่จะไดเห็นตัวอยางการเอาแนวคิดเรื่องวัตถุไป
ใชจริง อยางไรก็ตามอารเรยเปนวัตถุพิเศษจึงมีวิธีการใชงานและคําสั่งที่ไมเหมือนกับวัตถุทั่วไปนัก
ตัวอยาง การเขียนโปรแกรมเพื่อคํานวณคาเฉลี่ยดวยวิธีธรรมดาไมไดใชตัวแปรอารเรย
import javax.swing.JOptionPane;
public class InputTest {
public static void main(String args[]){
float sum = 0.0f, rainfall, annualAverage;
for (int i=0; i < 12; i++) {
String input = JOptionPane.showInputDialog("Rainfall for month" + (i+1));
rainfall =Float.parseFloat(input);
sum += rainfall;
}
annualAverage = sum / 12.0f;
JOptionPane.showMessageDialog(null,"Annual Average " + annualAverage);
System.exit(0);
}
}
จากโปรแกรมนี้เมื่อทําการรันจะปรากฎหนาจอเพื่อรับคาปริมาณน้ําฝนจํานวน 12 ครั้งดังหนาจอตอไปนี้
4. บทที่ 6 ตัวแปรอารเรย หนาที่ 144
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
เมื่อครบ 12 ครั้งแลวจะแสดงคาเฉลี่ยดังหนาจอตอไปนี้
จากโปแกรมดังกลาวหากตองการทราบปริมาณน้ําฝนในแตละเดือนจะไมสามารถนํากลับมาแสดงได
ดังนั้นหากขอมูลที่ตองการจัดเก็บมีลักษณะนี้ใหทําการเก็บขอมูลไวในตัวแปรชนิดอารเรย
6.1. การประกาศตัวแปรอารเรย 1 มิติสําหรับตัวแปรชนิดพื้นฐาน
อารเรยเปนวัตถุ ดังนั้นตองมีการประกาศตัวแปรอางอิง และสรางอินสแตนท การประกาศ
อารเรยหรือการประกาศตัวแปรอางอิงแบบอารเรยมี 2 รูปแบบคือ
รูปแบบที่ 1
Data_type[] data_identifier;
เชน double[ ] rainfall;
int[] a , b ,c ; // a ,b ,c เปนตัวแปร integer ชนิดอารเรย 1 มิติ
รูปแบบที่ 2
Data_type data_identifier[];
เชน double rainfall[ ];
int a , b[] , c ; // a , c เปนตัวแปร integer สวน b เปนตัวแปร integer ชนิดอารเรย
หมายเหตุ
ในการประกาศตัวแปรอารเรยนั้นไมสามารถระบุขนาดของ array ในสวน declare ได
เชน int a[3]; // error
5. บทที่ 6 ตัวแปรอารเรย หนาที่ 145
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
6.2 การสราง Array
เมื่อทําการประกาศตัวแปรแลวใหทําการสรางตัวแปรอารเรยโดยใชคําสั่ง new
รูปแบบที่ 1 สรางเมื่อประกาศตัวแปรอารเรยแลว
Data_identifier[] = new data_type[size_of_arry];
เชน rainfall = new double[12];
a = new int[5];
b = new int[20];
รูปแบบที่ 2 ทําการประกาศตัวแปรอารเรยพรอมสรางตัวแปรอารเรย
Data_type Data_identifier = new data_type[size_of_arry];
เชน double[ ] rainfall = new double[12]; //ทําการประกาศ &สราง
rainfall
0 1 2 3 4 5 6 7 8 9 10 11
rainfall[2]ตําแหนงแรกตําแหนงแรก
ของของ AArrrraayy จะเปนตําแหนงที่จะเปนตําแหนงที่ 00
หมายเหตุ :
หากตองการทราบขนาดของอารเรยสามารถหาไดจาก
รูปแบบ
ชื่อตัวแปรอารเรย.length
เชน int a ;
double[] rainfall = new double[12];
a = rainfall.length;
// a = 12
6. บทที่ 6 ตัวแปรอารเรย หนาที่ 146
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยาง แสดงการกําหนดคาเริ่มตนใหกับอารเรย 1 มิติ ดวยตัวอักษร A – Z
class testArray{
public static void main(String[] args) {
char ch[];
ch = new char[26];
// loop กําหนดคาเริ่มตนใหกับตัวแปรอารเรย
for(int i = 0; i < ch.length ; i ++){// สิ่งที่ไดจาก ch.length คือขนาดของอารเรย ch
ch[i] = (char)('A'+i);
}
// นําคาที่อยูในตัวแปรอารเรยมาแสดงบนหนาจอ
for (int i=0; i< ch.length ;i++ ){
System.out.print(ch[i] + "t");
}
}
}
ผลลัพธที่ไดคือ
A B C D E F G H I J K L
M N O P Q R S T U V W
X Y Z
ตัวอยาง การใชงาน Array
import javax.swing.JOptionPane;
public class InputTest {
public static void main(String args[]){
double[ ] rainfall = new double[12];
double annualAverage, sum = 0.0f;
for (int i = 0; i < rainfall.length ; i++) {
String input = JOptionPane.showInputDialog("Rainfall for month" + (i+1));
rainfal[i]l =Float.parseFloat(input);//ทําการแปลงคาจากตัวหนังสือเปน float
sum += rainfall[i];
}
7. บทที่ 6 ตัวแปรอารเรย หนาที่ 147
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
annualAverage = sum / rainfall.length; // rainfall.length = ขนาดของอารเรย rainfall
JOptionPane.showMessageDialog(null,"Annual Average " + annualAverage);
System.exit(0);
}
}
ตัวอยาง สวนของโปรแกรมเพื่อกําหนดคาเริ่มตนใหกับตัวแปรอารเรย
double[ ] rainfall = new double[12];
String[ ] monthName = new String[12];
monthName[0] = “January”;
monthName[1] = “February”;
…
double annualAverage, sum = 0.0f;
for (int i = 0; i < rainfall.length; i++) {
String input = JOptionPane.showInputDialog("Rainfall for month" + monthName[i]);
rainfal[i]l =Float.parseFloat(input);
sum += rainfall[i];
}
annualAverage = sum / rainfall.length;
ตัวอยาง สวนของการหาคาเฉลี่ยปริมาณน้ําฝนในแตละไตรมาศ
double[ ] quarterAverage = new double[4];
for (int i = 0; i < 4; i++) {
sum = 0;
for (int j = 0; j < 3; j++) {//compute the sum of one quarter
sum += rainfall[3*i + j];
}
quarterAverage[i] = sum / 3.0; //Quarter (i+1) average
ประกาศและสรางตัวแปรอารเรย
กําหนดคาเริ่มตนใหแกตัวแปรอารเรย
8. บทที่ 6 ตัวแปรอารเรย หนาที่ 148
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
หมายเหตุ
- Array ใน Java นั้นไมอยูในรูปแบบขอมูลเรียงตอๆกัน หากแตเปน Object ชนิดหนึ่ง
- Array ที่ยังไมทําการสราง(Construct)โดยใชคําสั่ง new จะมีคาเปน null หากมีการใชจะเกิด Runtime
Exception (NullException) จะกลาวถึงในบทที่ 13 ในตอนนี้ทราบเพียงวาสิ่งที่เกิดขึ้นเปนขอผิดพลาด
ชนิดหนึ่ง เกิดในขณะ run โปรแกรม
6.4 การกําหนดคาเริ่มตนให Array
เราสามารถทําการประกาศตัวแปร Array และทําการกําหนดคาเริ่มตนใหตัวแปร Array ในณะ
เดียวกันเชนเดียวกับการประกาศตัวแปรชนิดอื่นๆ
ตัวอยาง การสรางและกําหนดคาเริ่มตนใหอารเรย
int[ ] number = { 2, 4, 6, 8 };
double[ ] samplingData = { 2.443, 8.99, 12.3, 45.009, 18.2, 9.00, 3.123, 22.084, 18.08 };
char[] ch = {‘w’,’x’,’y’,’z’};
String[ ] monthName = {"January", "February", "March", "April", "May", "June", "July",
"August", "September", "October" , "November", "December" };
สังเกตวา กรณีที่กําหนดคาให array พรอมๆกับ declare ไมตองใช new
เชน int []a = { 1,2,3};
ตัวอยาง สรางและกําหนดคาแบบ Anonymous Array
char [] ch;
ch = new char[] {‘a’ , ‘b’, ‘c’};
หมายเหตุ
- การอางอิงเลข index ของ array ที่มากกวา length นั้นจะทําใหเกิด Run Time Exception เรียกวา
ArrayIndexOutofBoundException
- จะตองกําหนด size ของ array ที่จะสรางเสมอ หรือไมเชนนั้นก็ตองระบุสมาชิกใหแก array
int [] a ; a = new int[5];
int [] b ; b = new int[] {1,2,3};
Object [] c = new Object[3];
Object [] d = new Object[] {new Object(),”Test”}
9. บทที่ 6 ตัวแปรอารเรย หนาที่ 149
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
- จากการใชคําสั่ง char [] ch = new char[4];
ตัวอยาง หากไมไดกําหนดคาเริ่มตนใหตัวแปร Array จาวาเวอรชัวร(JVM) เปนผูกําหนดคาเริ่มตนใหใน
ขณะที่สรางตัวแปรอารเรยดวยคําสั่ง new
class NonInitial {
public static void main(String[] args) {
int size = 3;
byte b[] = new byte[size];
short s[] = new short[size];
int in[] = new int[size];
float f[]=new float[size];
boolean bl[] = new boolean[size];
System.out.println(" tbytetshorttinttfloattboolean");
for(int i =0; i<b.length; i++){
System.out.println("index "+ i + "t"+b[i] +"t"+s[i]+"t"+in[i]+"t" +f[i]+"t"
+ bl[i]+"t"+ "stop");
}
}
}
ผลลัพธที่ได
byte short int float boolean
index 0 0 0 0 0.0 false stop
index 1 0 0 0 0.0 false stop
index 2 0 0 0 0.0 false stop
Stack Execution
ch
10. บทที่ 6 ตัวแปรอารเรย หนาที่ 150
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
6.5 อารเรยของ Objects
นอกจาก Arrays จะสามารถใชงานกับขอมูลประเภท Primitive Data Type แลว เรายังสามารถ
ใชงาน Array กับขอมูลประเภท Reference Data Type ไดอีกดวย
ตัวอยาง Class Person
ขั้นตอนที่ 1
Person[ ] person; // ประกาศออบเจ็ค
ขั้นตอนที่ 2
person = new Person[5]; // สรางออบเจ็ค
ขั้นตอนที่ 3
person[0] = new Person ( );
Person
name : String
inpStr : String
age : int
gender : char
setName(String) : void
setinpStr(String) : void
setAge(int ) : void
setGender(char) : void
ppeerrssoonn
ppeerrssoonn
0 1 2 3 4
Person
ppeerrssoonn
0 1 2 3 4
11. บทที่ 6 ตัวแปรอารเรย หนาที่ 151
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
ตัวอยาง การสราง Person objects และการสราง person array
import javax.swing.JOptionPane;
class Person{
String name;
int age;
char gender;
void setAge(int a){age = a;}
void setName(String s){name =s;}
void setGender(char g){gender = g;}
};
public class TestCreateObjectArray{
public static void main(String[] args) {
Person[ ] person = new Person[2];
String name, inpStr;
int age;
char gender;
// ทําการรับคาใหเพื่อกําหนดคาใหกับ Object Person
for (int i = 0; i < person.length; i++) {
name = JOptionPane.showInputDialog("Enter name:"); //รับชื่อ
inpStr = JOptionPane.showInputDialog("Enter age:");//รับขอมูลอายุ
age = Integer.parseInt(inpStr);//ทําการเปลี่ยนคาที่รับเปนชนิด integer
inpStr = JOptionPane.showInputDialog("Enter gender:");//รับขอมูลเพศ
gender = inpStr.charAt(0);// gender ตัดเฉพาะตัวอักษรตัวแรกของ inpStr
person[i] = new Person( ); //สราง object Person
person[i].setName(name); // เรียกใช method setName เพื่อกําหนด name ใหกับ person[i]
person[i].setAge ( age ); // เรียกใช method setName เพื่อกําหนด name ใหกับ person[i]
person[i].setGender( gender ); // เรียกใช method setName เพื่อกําหนด name ใหกับ person[i]
}
// แสดงคาที่อยูใน Object Person บนหนาจอ Output
for(int i = 0 ; i < person.length;i++){
System.out.println("Person Number " + (i+1) );
12. บทที่ 6 ตัวแปรอารเรย หนาที่ 152
เอกสารประกอบการสอน 305272 การเขียนโปรแกรมคอมพิวเตอรขั้นสูง
อ.สุรางคนา ระวังยศ
System.out.println(person[i].name + " " + person[i].age + " " +person[i].gender);
}
System.exit(0);
}}
เมื่อทําการกรอกขอมูลจํานวน 2 คนแลวจะปรากฎขอมูลตอไปนี้ในผลลัพธ
Person Number 1
surangkana 20 F
Person Number 2
suda 24 m
ตัวอยาง การหาคนที่อายุมากและอายุนอยที่สุด
int minIdx = 0; //index to the youngest person
int maxIdx = 0; //index to the oldest person
for (int i = 1; i < person.length; i++) {
if ( person[i].getAge() < person[minIdx].getAge() ) {