ในบทน้ีเราจะมาดกู ารสรา งและใช array ซึ่งเปน โครงสรางอกี ตัวหน่ึงทท่ี ําใหเราสามารถเก็บขอมลู ที่เปนชนิดเดยี วกนั หลาย ๆ ตวั ไวใ นตวั แปรตวั เดยี ว รวมไปถึงการสรางและใช string ซ่ึงจะเปน การแนะนาํ ใหผอู านไดรจู กั กับ object ในภาษา Java แบบคราว ๆหลงั จากจบบทเรียนน้ีแลว ผอู า นจะไดท ราบถงึ o การประกาศและกาํ หนดคา ให array o การเขาหาขอมลู ในตาํ แหนง ตา ง ๆ ท่ีอยูใน array o การสราง array ทีใ่ ชเก็บ array o การสรา ง object ท่ีเปน string o การสรางและใช array ทเ่ี กบ็ object o การใชก ระบวนการตา ง ๆ กบั object ที่เปน stringการใช arrayArray เปน โครงสรา งชนิดหน่ึงที่ประกอบไปดว ยขอมูลชนดิ เดียวกนั ทอี่ าจมมี ากกวา หน่งึ ตัว การเขาหาขอ มลู แตล ะตวั ท่ีอยูใ น array จะตอ งทาํ ผา นทาง ชือ่ ของ array และ index ทม่ี คี าเปน integer (int)ประกอบกัน Java ไดก าํ หนดให index ตวั แรกสุดทเี่ กบ็ ขอมูลมคี าเปน 0 และจะเพิม่ ข้ึนทลี ะหนึ่งคา ไปเรื่อย ๆ จนกวาจะหมดขอ มูลทมี่ ีอยใู น array นั้น ๆ การประกาศตัวแปรทีเ่ ปน array ทาํ ไดดงั นี้datatype[] nameOfArray;เชนint[] listOfNumbers;double[] prices;char[] vowels;ในการประกาศ array น้นั เราจะตองกาํ หนดจาํ นวนของขอ มูลสงู สดุ ท่ี array นัน้ สามารถเก็บได ชนดิ ของขอ มูลทจ่ี ะเก็บไวใน array น้ัน เคร่ืองหมาย [] เปนตัวบอกให Java รวู า ตวั แปรท่ีถกู สรางขึน้ มานเ้ี ปนarray และเครอื่ งหมายน้ีกจ็ ะเปน ตวั ทใ่ี ชใ นการเขา หาขอ มลู แตละตัวใน array หนงั สือหลาย ๆ เลมเลอื กท่ีจะประกาศ array ในรปู แบบทเ่ี หน็ ดานลา งน้ี ซงึ่ มีความหมายเหมือนกันกบั ทเ่ี ราไดป ระกาศกอนหนาน้ีint listOfNumbers[];double prices[];char vowels[];สําหรบั หนงั สือเลม นเี้ ราจะใชก ารประกาศในแบบทห่ี น่งึหลังจากท่เี ราไดป ระกาศใหต วั แปรเปน array แลวเราก็ตอ งกาํ หนดความจใุ หก ับ array น้ัน ดงั น้ีlistOfNumbers = new int[5];
บทท่ี 4 การใช Array และ String 97เรม่ิ ตน กับ Javaประโยคทเ่ี ราไดเขยี นข้ึนนั้นบอกให Java รวู า เราตองการให Java จองเนอ้ื ทีใ่ นการเกบ็ int เปน จาํ นวนเทา กับ 10 ตัวใหก ับตัวแปร listOfNumbers ซึง่ ตัวแปรน้จี ะเปน ตัวอา งอิง (reference) ถงึ ขอ มูลทัง้ หมดท่ีไดถกู เกบ็ ไวใ น array นี้ ภาพที่ 4.1 แสดงถึงสง่ิ ตา ง ๆ ท่เี กดิ ข้ึนเม่ือเราประกาศการใช arrayประกาศ array ที่ ชื่อของ ชนดิ ของขอ มลู ที่ arrayเก็บ int array num เก็บได int [] num = new int[5]; ใช operator new ในการจองเนอื้ ท่ี ชนิด int จํานวน 5 ตัว index ของ array num num[0] num[1] num[2] num[3] num[4] num.length จะมีคาเทากับ 5ภาพท่ี 4.1 การประกาศและกําหนดขนาดของ arrayเมือ่ มกี ารประกาศใช array เชนint [] num;น้นั array ท่เี ราไดป ระกาศนั้นยงั ไมมีเน้อื ที่ในหนว ยความจาํ เลย เราตองกําหนดขนาดเพ่อื ใหเ กิดการจองเนอื้ ทใ่ี นหนว ยความจาํ ดวยการใช operator new รวมไปถงึ จํานวนของเน้ือท่ที ตี่ องการใช เชนint [] num = new int[5];และทุกครงั้ ของการจองเนอื้ ที่ Java จะกาํ หนดใหขอ มลู ในทกุ ๆ ตําแหนง มคี าเปน 0 เสมอในการเขาหาขอ มลู แตละตัวนน้ั เรากเ็ พยี งแตก ําหนด index ของขอ มลู ทเ่ี ราตองการเขา หา เชนnum[3]num[2]เราไมสามารถเขาหาขอ มลู ณ ตาํ แหนง ทม่ี คี า index เกนิ 4 ไดทั้งนเี้ พราะเรากําหนดให array num มีความจสุ งู สุดเทา กับ 5 ดังนน้ั คา ของ index ทเ่ี ปน ไปได คอื 0 1 2 3 และ 4 ถา หากวาเราเขา หาขอมูลที่ไมอยใู นตําแหนง ท่ีกลาวน้ี Java จะฟอ งดวย error ทนั ที (array index out of bound)การกาํ หนดคา เบอ้ื งตนใหก บั arrayเรารวู า หลงั จากการประกาศและจองเนอ้ื ที่ใหกบั array น้นั ถาเปน array ท่เี กบ็ int ทกุ ๆ หนว ยความจําของ array จะมีคา เปน 0 แตถ าเราตอ งการใหเ ปนคา อ่ืนเรากส็ ามารถทาํ ได ดังโปรแกรมตวั อยา งนี้/* Array1.java */import java.io.*;class Array1 { ภาควิชาคอมพิวเตอรธุรกจิ วทิ ยาลัยฟารอสี เทอรน
บทที่ 4 การใช Array และ String 98เรม่ิ ตน กับ Javapublic static void main(String[] args) {int[] list; //declare array of int list = new int[10]; //allocate space for 10 ints for(int i = 0; i < list.length; i++) System.out.println(\"list[\" + i +\"] = \" + list[i]); }}โปรแกรม Array1.java ประกาศใหต วั แปร list เปน array ทเ่ี ก็บ int เปน จํานวนเทากบั 10 ตัว เมื่อประกาศเสร็จแลว เราก็ใช for loop ในการเขาหาขอ มลู ในแตล ะตวั array โดยแสดงถงึ คา ท่ี Java กําหนดใหกับ array ของเราไปยังหนา จอ ซงึ่ มคี าดงั นี้list[0] = 0list[1] = 0list[2] = 0list[3] = 0list[4] = 0list[5] = 0list[6] = 0list[7] = 0list[8] = 0list[9] = 0การใช loop เปน วิธกี ารทีง่ า ยทสี่ ุดในการเขา หาขอมลู ทุกตัวทอี่ ยูใน array ยกเวน วาเรารูต าํ แหนงท่ีแนน อนของขอ มลู ที่เราตองการใน array นั้น เชน ตาํ แหนง ที่ 5 หรือตาํ แหนง ท่ี 3 เรากเ็ ขา หาไดโ ดยตรงดงั นี้ list[5] หรอื list[3] เปนตนArray ทสี่ รางขน้ึ ใน Java น้นั เราสามารถทีจ่ ะดงึ เอาขนาดของ array ออกมาไดดว ยการเรยี กใชคา คงทที่ ี่ไดถ ูกสรา งข้นึ หลงั จากการประกาศและจองเนอ้ื ท่ีใหกับ array ดงั น้ีlist.length;ทุก array ทไ่ี ดถ กู สรา งขึน้ จะมขี นาดของ array เกบ็ ไวใ นตัวแปรชอื่ length และเราเรยี กขนาดออกมาไดผานทางช่ือของ array ตามดว ย . และตวั แปร lengthเรามาลองกาํ หนดคาในตาํ แหนง ตาง ๆ ใหก บั array ของเรา/* Array2.java */import java.io.*;class Array2 {public static void main(String[] args) {int[] list; //declare array of int list = new int[10]; //allocate space for 10 ints list[5] = 8; list[3] = 2; list[9] = 4; for(int i = 0; i < list.length; i++) System.out.println(\"list[\" + i +\"] = \" + list[i]); }}ผลลพั ธท ีไ่ ดจ ากการ run คอื ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลยั ฟารอสี เทอรน
บทที่ 4 การใช Array และ String 99เริ่มตนกับ Javalist[0] = 0list[1] = 0list[2] = 0list[3] = 2list[4] = 0list[5] = 8list[6] = 0list[7] = 0list[8] = 0list[9] = 4เราสามารถทจ่ี ะกําหนดคา ใหก บั array โดยท่ไี มต องกาํ หนดขนาดใหก บั array โดยตรง แตให Javaจัดการเกยี่ วกบั เรื่องเน้อื ท่ีใหเรา ดังโปรแกรมตวั อยางตอไปนี้/* Array3.java */import java.io.*;class Array3 { public static void main(String[] args) { int[] list = {2, 3, 1, 56, 90}; for(int i = 0; i < list.length; i++) System.out.println(\"list[\" + i +\"] = \" + list[i]); }}เรากาํ หนดให list เปน array ทเ่ี ก็บ int และกําหนดคา เบอื้ งตน เปน 2 3 1 56 และ 90 ตามลําดบั เม่อืJava เห็นการประกาศในลักษณะน้กี จ็ ะทาํ การจองเน้ือทใี่ หกบั array โดยอตั โนมัติพรอมทง้ั นาํ คา ตา ง ๆ ที่ไดถูกกาํ หนดจาก user ไปใสไ วใ น array list และเมอื่ run ดเู ราก็ไดผ ลลพั ธดังทีเ่ หน็ นี้list[0] = 2list[1] = 3list[2] = 1list[3] = 56list[4] = 90โปรแกรมตัวอยา งตอไปนีแ้ สดงถึงการเก็บขอมูลท่ี user ใสเขามาจาก keyboard เขาสู array/* ArrayOfNumbers.java */import java.io.*;import java.text.DecimalFormat;import java.lang.Integer;class ArrayOfNumbers {public static void main(String[] args) throws IOException {double number, sum = 0; //a number read and sum of numbersdouble[] list; //array of doubleint count; //number of items in arrayString input; //input stringBufferedReader buffer; //input bufferInputStreamReader isr; //input streamDecimalFormat f = new DecimalFormat(\"0.00\");System.out.print(\"How many numbers? : \");isr = new InputStreamReader(System.in);buffer = new BufferedReader(isr); ภาควิชาคอมพิวเตอรธ ุรกิจ วทิ ยาลยั ฟารอสี เทอรน
บทที่ 4 การใช Array และ String 100เรม่ิ ตน กับ Javainput = buffer.readLine();count = Integer.parseInt(input); //total items in listlist = new double[count]; //allocate space forlist//reading each double into listfor(int i = 0; i < list.length; i++) { System.out.print(\"Enter number: \"); input = buffer.readLine(); list[i] = Double.parseDouble(input);}//add all doubles in listint n = list.length - 1; //n is the last index of listwhile(n >= 0) { //looping until n equals to 0 sum += list[n--]; //add list[n] into sum and} //decrement n //calculate average and display result double average = sum / count; System.out.println(\"Sum of numbers = \" + sum); System.out.println(\"Average of numbers = \" + f.format(average)); }}โปรแกรม ArrayOfNumbers.java ถาม user ถงึ จํานวนของขอ มูลสูงสดุ ท่ี user จะใสเขา สโู ปรแกรม ซ่ึงเม่อื ไดแลว โปรแกรมจะใชจ าํ นวนทอ่ี านไดเปน ตวั กาํ หนดขนาดใหก บั arraylist = new double[count];หลังจากนน้ั กจ็ ะอา นขอ มลู ทลี ะตวั จาก user นําไปเกบ็ ไวใ น array listfor(int i = 0; i < list.length; i++) { System.out.print(\"Enter number: \"); input = buffer.readLine(); list[i] = Double.parseDouble(input);}ในขณะทีอ่ านขอ มูลเขา สู array นน้ั เราอาจหาผลรวมของเลขทกุ ตวั พรอม ๆ กันไปดว ยกไ็ ด แตท ่ีโปรแกรมนแ้ี ยกการหาผลรวมก็เพอ่ื ที่จะแสดงใหเห็นถึงการใช loop ในการเขาหา array อกี คร้งั หน่ึง โดยเรากาํ หนดใหต วั แปร n เปน index ตวั สดุ ทายของ array list ดวยประโยคint n = list.length - 1;เราตองไมล มื วา list.length ใหจาํ นวนของขอ มลู ทั้งหมดทอ่ี ยูใน array ดงั นนั้ index ตัวสดุ ทา ยก็คือlist.length – 1 หลังจากนัน้ เราจะใช while loop เปน ตัวเขา หาขอ มลู ใน array แตล ะตวั จากขางหลัง และบวกขอ มลู ทุก ๆ ตวั เขา กบั ตัวแปร sumwhile(n >= 0) { sum += list[n--];}ประโยค sum += list[n--] นน้ั จะบวกขอมูลในตาํ แหนง n เขา กบั ตัวแปร sum กอ นทจ่ี ะลดคาของ n ลงหน่งึ คา และเมอื่ คา n นอ ยกวา 0 เราก็หลดุ ออกจาก while loop ทันที ภาควิชาคอมพิวเตอรธ รุ กิจ วทิ ยาลยั ฟารอีสเทอรน
บทที่ 4 การใช Array และ String 101เรมิ่ ตน กับ Javaการอา งถึง array ดวยการ clone และการ copy arrayเม่ือเราสรา ง array ข้นึ มาแลวเราสามารถทจี่ ะอา งถงึ ตวั แปรตวั นด้ี ว ยตัวแปรอน่ื กไ็ ด แตไมไ ดห มายความวา เราไดส ราง array ตวั ใหมจ ากตัวแปรตวั ใหมนี้ เราเพยี งแตใ ชตวั แปรตวั ใหมในการอางถงึ array ตัวเดมิเพราะฉะนน้ั การกระทําใด ๆ ผา นตวั แปรตวั ใหมก็จะมผี ลกระทบกบั ขอมูลใน array ตวั เดิมนัน้ ดงั โปรแกรมตวั อยางนี้/* Array4.java */import java.io.*;class Array4 { public static void main(String[] args) { int[] list = {2, 3, 1, 56, 90}; for(int i = 0; i < list.length; i++) System.out.println(\"list[\" + i +\"] = \" + list[i]); int[] newList = list; //cloning newList[0] = 11; //changing data at list[0] for(int i = 0; i < list.length; i++) System.out.println(\"list[\" + i +\"] = \" + list[i]); }}เราไดดดั แปลงโปรแกรม Array3.java ใหม กี ารอา งถึง (reference) array list ดว ยตวั แปรตัวใหมท ชี่ ื่อnewListint[] newList = list;และเรากไ็ ดท ําการเปล่ยี นขอ มลู ณ ตาํ แหนง 0 ใหเ ปน 11 ผา นทาง newList เมื่อลอง run ดเู รากจ็ ะไดผลลพั ธด งั ทคี่ าดไวlist[0] = 2list[1] = 3list[2] = 1list[3] = 56list[4] = 90list[0] = 11list[1] = 3list[2] = 1list[3] = 56list[4] = 90สว นวธิ กี าร copy ขอมลู จาก array ตัวหนงึ่ ไปยัง array อีกตัวหน่งึ นนั้ มวี ธิ ีการอยสู ามวธิ ที ท่ี าํ ได วิธที ี่หนงึ่นั้นเราตอ งสรา ง array ใหมข นึ้ มาแลว ก็ copy ขอมูลทุกตวั จาก array ตัวเดิมเขา สู array ตัวใหม ดงั น้ี/* Array5.java */import java.io.*;class Array5 { //original array public static void main(String[] args) { //new array int[] list = {2, 3, 1, 56, 90}; int[] newList = new int[list.length]; ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลยั ฟารอ ีสเทอรน
บทที่ 4 การใช Array และ String 102เรม่ิ ตนกบั Java //copy each item from list into newList for(int i = 0; i < list.length; i++) newList[i] = list[i]; for(int i = 0; i < list.length; i++) System.out.println(\"newList[\" + i +\"] = \" + newList[i]); }}โปรแกรม Array5.java สราง newList ดวยคาํ สงั่int[] newList = new int[list.length];เรากําหนดขนาดของ newList ดวยขนาดทม่ี าจาก list หลงั จากนั้นเราก็ copy ขอ มลู ทกุ ตัวดวยการใช for– loopfor(int i = 0; i < list.length; i++) newList[i] = list[i];และเมอ่ื run ดเู รากไ็ ดผลลัพธด งั ทคี่ าดไว คอืnewList[0] = 2newList[1] = 3newList[2] = 1newList[3] = 56newList[4] = 90ทีนีเ้ รามาดูวิธที สี่ องกนั/* Array6.java */import java.io.*;class Array6 { //original array public static void main(String[] args) { //new array int[] list = {2, 3, 1, 56, 90}; int[] newList = new int[list.length]; //copy each item from list into newList System.arraycopy(list, 0, newList, 0, list.length); for(int i = 0; i < newList.length; i++) System.out.println(\"newList[\" + i +\"] = \" + newList[i]); }}ถงึ แมวาเรายงั ไมไดพูดถงึ เร่อื งของ class หรือ method แตเ ราก็ตองมาทาํ ความเขาใจถึงการเรยี กใชmethod ท่ี Java มใี ห เพราะวา วิธีทส่ี องน้ีเราใช method arraycopy() ทาํ การสรา งและ copy ขอ มูลใหตอนนี้เราคงตอ งจาํ วธิ กี ารเรยี กใชม ากกวาการทําความเขาใจอยางละเอียด (ซงึ่ เราจะพดู ถึงในบทตอ ๆไป) เรา copy ดวยการใชค ําสงั่System.arraycopy(list, 0, newList, 0, list.length);โดยเราตอ งใสข อมูล หรือ เง่ือนไข (parameter) ตามที่ Java กําหนดไวค อื ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลัยฟารอีสเทอรน
บทที่ 4 การใช Array และ String 103เร่ิมตนกบั Javaตัวแรกเปน array ตวั เดมิ ทต่ี อ งการ copy (list)ตวั ทส่ี องเปน index เร่ิมตนของ array ตวั เดิม (0)ตัวทสี่ ามเปน array ตวั ใหมท ตี่ อ งการสรา ง (newList)ตัวทสี่ ี่เปน index เริ่มตนของ array ตัวใหม (0)ตัวทห่ี าเปน จาํ นวนของขอมลู ท่ตี องการ copy (list.length)วิธที ส่ี ามกค็ ลา ย ๆ กบั วธิ ที ส่ี องเพียงแตเ ราเรยี กใช method clone() แทน ซึ่งทาํ ไดด งั นี้/* Array7.java */import java.io.*;class Array7 { //original array public static void main(String[] args) { int[] list = {2, 3, 1, 56, 90}; //cloning process int[] newList = (int[])list.clone(); for(int i = 0; i < list.length; i++) System.out.println(\"newList[\" + i +\"] = \" + newList[i]); }}เราเพียงแตเรยี กใช method clone() ดงั ท่ีเหน็ ในโปรแกรม Array7.java เรากส็ ามารถทจี่ ะมี array ตวัใหมส าํ หรบั การใชง าน ดว ยประโยคint[] newList = (int[])list.clone();เราจําเปนทจี่ ะตองทาํ การ cast ใหก บั array ของเราเสยี กอ นเพือ่ ใหช นิดของ array ทถ่ี กู clone ขึน้ มานน้ัเปนชนิดเดียวกัน ซงึ่ ทาํ ไดด วยการนาํ เอา (int[]) ไปใสไ วหนา ประโยค list.clone() ท้งั นต้ี องกําหนดชอ่ืarray ตัวเดมิ ใหถ ูกตอง (list) เพ่อื ไมใหเกดิ การผดิ พลาดใด ๆวธิ ที สี่ ามทไ่ี ดกลาวไวจ ะ copy ขอมลู ใน array เดมิ ท่มี ีอยทู งั้ หมดไปเกบ็ ไวใ น array ตวั ใหม ดังนัน้ ถาหากวาเราตองการทจ่ี ะสราง array ใหมจากขอ มลู บางสวนของ array ตัวเดิมเราก็ตองใชว ธิ ีท่สี อง ดังตัวอยา งนี้/* Array8.java */import java.io.*;class Array8 {public static void main(String[] args) { int[] list = {2, 3, 1, 56, 90}; //original array int[] newList = new int[list.length-2]; //new array //copy item at index 2, 3, and 4 from list into newList System.arraycopy(list, 2, newList, 0, list.length – 2); for(int i = 0; i < newList.length; i++) System.out.println(\"newList[\" + i +\"] = \" + newList[i]); }} ภาควิชาคอมพิวเตอรธุรกจิ วทิ ยาลยั ฟารอสี เทอรน
บทท่ี 4 การใช Array และ String 104เรมิ่ ตนกบั Javaโปรแกรม Array8.java ของเราตองการท่จี ะ copy ขอมูล ณ ตําแหนงท่ี 2 3 และ 4 จาก array list เขา สูarray newList ในตําแหนง 0 1 และ 2 ตามลาํ ดบั เพราะฉะนนั้ เราตองเรยี กใช method arraycopy()ดงั น้ีSystem.arraycopy(list, 2, newList, 0, list.length – 2);ผลลพั ธข องการ run คอืnewList[0] = 1newList[1] = 56newList[2] = 90การใช array แบบยดื หยนุ (Dynamic Array)เราสามารถทจ่ี ะใชเทคนคิ ทเี่ ราพดู มากอ นหนา นีใ้ นการสรา ง array แบบไมจาํ กดั จํานวนของขอมูลที่สามารถจดั เก็บไดใ น array น้ัน ๆ เราเรยี กการจดั เก็บแบบน้วี า การจดั เก็บแบบยืดหยนุ แตก อนท่เี ราจะสรา งไดน ั้นเราตองกาํ หนดให array เร่มิ ตนของเรามีขนาดเบือ้ งตนกอน หลังจากนน้ั จึงจะสามารถขยายขนาดของ array ได ดงั โปรแกรมตวั อยา งทไี่ ดด ัดแปลงมาจากโปรแกรม AddNumbers.java ทีเ่ ขยี นขึ้นกอ นหนานี้/* DynamicArray.java */import java.io.*;import java.text.DecimalFormat;class DynamicArray {public static void main(String[] args) throws IOException {double number, sum = 0; //a number read and sum of numbersdouble []list = new double[2]; //array of doubleint count = 0; //total numbers readBufferedReader buffer; //input bufferInputStreamReader isr; //input streamStreamTokenizer token; //token from input streamDecimalFormat f = new DecimalFormat(\"0.00\");System.out.print(\"Enter numbers (space between – enter when done): \");isr = new InputStreamReader(System.in);buffer = new BufferedReader(isr);//get tokens from input buffertoken = new StreamTokenizer(buffer);//set priority to EOL so that we can break out of the looptoken.eolIsSignificant(true);//get each number from tokens//calculate the sum until EOL is reachedwhile(token.nextToken() != token.TT_EOL) { switch(token.ttype) { //token is a number case StreamTokenizer.TT_NUMBER: //double the size of list if(count > list.length-1) { double []newList = new double[list.length*2]; System.arraycopy(list, 0, newList, 0, list.length); list = newList; //point to new list } list[count] = token.nval; //save token into list ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลัยฟารอีสเทอรน
บทที่ 4 การใช Array และ String 105เริม่ ตนกบั Java sum += list[count]; //calculate sum count++; //number of tokens read break; default: System.out.println(\"Token is not a number! \"); break; } } //calculate average and display result double average = sum / count; System.out.println(\"Sum of numbers = \" + sum); System.out.println(\"Average of numbers = \" + f.format(average)); }}เราประกาศตัวแปร list ใหเ ปน array ทเี่ ก็บ double เร่ิมตน ดว ยจาํ นวนเทากบั 2ตัว และในการนาํ ขอ มลูเขา สู array น้ันเราจะตรวจสอบดูวา จาํ นวนของ index ทเี่ ราใชใ นการเขาหาขอมูลแตล ะตัวมีคาเกินจํานวนของขอ มลู ที่เปน อยูขณะนนั้ หรอื ไม ซ่งึ ถาเปน จรงิ เรากจ็ ะทาํ การขยายขนาดใหก ับ array list เปนจาํ นวนสองเทา ของขนาดเดมิ และทาํ การ copy ขอ มูลจาก array list ไปสู array ใหมนี้ (newList) หลงั จากนนั้เรากอ็ างถึง array ตัวใหมน ีด้ ว ยตวั แปรเดิมทีเ่ ราใชในการเก็บขอมูลครงั้ แรก (list) เราไมตอ งกังวลถึงหนวยความจาํ ที่เราไดใ ชไปในการสรา ง array ตวั เดมิ เพราะ Java จะทาํ การตรวจสอบถึงหนวยความจาํ ที่ไมม ีการใชง าน และจะคนื หนว ยความจาํ นใี้ หก บั ระบบโดยอตั โนมตั ิif(count > list.length-1) { double []newList = new double[list.length*2]; System.arraycopy(list, 0, newList, 0, list.length); list = newList;}วธิ ีการขยายขนาดของ array แบบน้ที ําใหเ ราไมต องกาํ หนดขนาดของ array ใหมขี นาดใหญมากมายเกินไปตอนท่ีเราสรา ง array ในครง้ั แรก เราสนใจเฉพาะเมอื่ จําเปนตองขยายขนาดของ array จริง ๆเทา น้ัน ผูอานอาจเปลี่ยนแปลงการขยายขนาดของ array ดวยการเพิม่ ทลี ะกตี่ ัวก็ได ทั้งน้กี ข็ ้นึ อยกู ับความจําเปนและเหมาะสมกบั งานนน้ั ๆผลลัพธข องการ run โปรแกรม DynamicArray.javaEnter numbers (space between - enter when done): 15 5 20 15 10 15 20Sum of numbers = 100.0Average of numbers = 14.29โปรแกรมตัวอยา งการใช array ในการนบั จํานวนคร้งั ของลกู เตาท่อี อกซํา้ กันจากการโยนหลาย ๆ คร้ัง/* DiceRolling.java */import java.io.*;class DiceRolling { public static void main(String[] args) { int face, roll; int[] frequency = new int[7];//number of times each face occur //rolling the die for 100 times roll = 1; while(roll <= 100) { //calculate face of die face = (int)(Math.random() * 6) + 1; ภาควิชาคอมพิวเตอรธุรกิจ วิทยาลัยฟารอ สี เทอรน
บทท่ี 4 การใช Array และ String 106เร่ิมตน กับ Java //save each time the same face occur by using //indeces as faces of die frequency[face]++; roll++; } System.out.println(\"Face\tFrequency\"); for(int i = 1; i < frequency.length; i++) System.out.println(i + \"\t\" + frequency[i]); }}โปรแกรม DiceRolling.java ใชต ัว index ของ array เปนหนา ของลกู เตาทีถ่ ูกโยนโดยการใชการสมุ ผา นทาง method random() ซึ่งจะบังคับใหผ ลลพั ธของการโยนนนั้ อยูระหวาง 1 – 6 ดวยการคูณ 6 เขากบัผลลพั ธท ่ีไดจ ากการสุม บวกเขากับ 1 การนับจาํ นวนคร้งั ก็ทําไดด วยการเพมิ่ คาใหก ับขอมลู ท่ี index นั้น ๆของลกู เตา เชน ถาการโยนไดคาเทา กบั 6 เรากเ็ พิ่มคาดว ย frequency[6]++ ซ่งึ จะทาํ ใหค า ทอ่ี ยู ณตาํ แหนง นน้ั เพมิ่ ขนึ้ อกี หนึ่งคา วธิ กี ารใช index ของ array ในลักษณะนช้ี ว ยลดขน้ั ตอนการนับจํานวนของหนาลกู เตาทเ่ี กิดข้นึ ไดด กี วาวธิ อี น่ื ๆ เชน การใช if – else มาชว ยในการตรวจสอบวาการโยนใหค า อะไรแลว จึงเพิ่มคา ใหกับตวั แปรที่เกบ็ การนบั ของหนานน้ั ๆif(face == 1) count1++;else if(face == 2) count2++;else if(face == 3) count3++;……else if(face == 6) count6++;ซ่งึ เปน วิธที ต่ี อ งเขยี น code มากกวา และใชตวั แปรเยอะกวา การใช frequency[face]++ผลลัพธของการ runFace Frequency1 122 253 244 75 126 19การคน หาขอมลู ใน arrayการคน หาขอ มลู ใน array นัน้ ทําไดอ ยสู องวธิ ใี หญ ๆ คือ การคนหาแบบตามลําดบั (sequential search)และ การคน หาแบบหารสอง (binary search) เราจะมาดถู ึงวิธกี ารคน หาแบบตามลําดบั กอ น เพราะเปนการคนหาทงี่ ายทส่ี ดุการคนหาแบบตามลาํ ดบั (Sequential search)ในการคนหาแบบนีน้ ้ันเราจะเรม่ิ ตน จากขอ มูลตัวแรกสดุ ทอี่ ยใู น array ทําการเปรยี บเทยี บขอมลู ตัวนีก้ ับขอ มลู ที่ตองการคนหาวาเปน ตวั เดยี วกันหรอื ไม ถาใชเรากห็ ยดุ การคนหา ถา เราคน ไปจนถงึ ตวั สดุ ทา ยแตกย็ งั ไมใ ช เรากร็ วู า ขอ มลู ท่ตี องการคนหาไมไ ดอ ยใู น array ลองดโู ปรแกรมตวั อยา งกัน ภาควิชาคอมพิวเตอรธรุ กจิ วทิ ยาลยั ฟารอ ีสเทอรน
บทที่ 4 การใช Array และ String 107เรม่ิ ตน กับ Java/* SeqSearch.java */import java.io.*;class SeqSearch { public static void main(String[] args) { int[] list = {2, 3, 1, 56, 90};;int number = 90; //number to searchint i = 0; //loop indexboolean notFound = true; //loop control variablewhile(notFound) { if(number == list[i]) //if found notFound = false; //break out of loop i++; //move to next number} //in the list if(!notFound) System.out.println(number + \" is in the list.\"); else System.out.println(number + \" is not in the list.\"); }}เราใช while loop ในการเขา หาขอมูลทุกตวั ทอี่ ยูใน array list โดยเรากําหนดใหต วั แปร notFound ซ่ึงมีชนิดเปน boolean เปน ตัวควบคุมการทํางานของ loop ซึง่ ถา การคน หาประสพผลสําเรจ็ ตวั แปรnotFound ก็จะถกู กาํ หนดใหเปน false และ while loop ของเรากจ็ ะยตุ ิการทาํ งานทนั ที หลังจากนั้นเราก็แสดงผลของการคนหาไปยงั หนาจอ ดงั ตวั อยา งของการคน หาเลข 90 จากโปรแกรมของเราน้ี90 is in the list.ถา หากวา เราไมตอ งการใช boolean เปนตวั กําหนดการทํางานของ loop เราก็อาจกาํ หนดให loop ทาํ งานไปเรอื่ ย ๆ และใชคาํ สัง่ break เปนตวั กาํ หนดการหยดุ กไ็ ด โดยการเปลย่ี น code ใหเ ปน/* SeqSearch2.java */import java.io.*;class SeqSearch2 { public static void main(String[] args) { int[] list = {2, 3, 1, 56, 90};int number = 90; //number to searchint i = 0; //loop indexwhile(true) { if(number == list[i]) //if found break; //break out of loop i++; //move to next number} //in the list if(i >= list.length) System.out.println(number + \" is not in the list.\"); else System.out.println(number + \" is in the list.\"); }} ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลยั ฟารอีสเทอรน
บทท่ี 4 การใช Array และ String 108เรมิ่ ตน กบั Javaเรารวู า ถา ขอมูลทต่ี อ งการคน หาไมอ ยใู น list ตัวแปร i จะมคี า เกินกวา จํานวนของขอมูลทีม่ อี ยใู น arrayดังนนั้ การแสดงผลจะตองใชก ารเปรยี บเทยี บคา ของ i กับจํานวนของขอ มูลทม่ี อี ยใู น array (แทนการเปรยี บเทยี บดว ย boolean กอนหนา นี)้ วิธีการตรวจสอบแบบนี้ลดขนั้ ตอนการทาํ งานของ loop ลงไปไดหน่ึงครั้ง เพราะเราจะ break ออกจาก loop ทันที ทีเ่ ราคน หาขอมูลเจอการคน หาแบบนีไ้ มค อ ยนยิ มใชก นั มากเทา ไร ทัง้ น้ีก็เพราะวา จะใชเ วลาในการคน หามาก ถาขอมลู ที่ตองการคน หาอยดู า นหลังสดุ ของ array ยิ่งถา array เก็บขอมลู ไวเยอะการคนหาก็จะใชเวลามากย่งิ ข้นึการคนหาแบบหารสอง (Binary search)การคน หาในรูปแบบของ binary search จะทาํ การแบงขอมลู ท้ังหมดออกเปนสองสวนทกุ ครงั้ ทม่ี ีการเปรียบเทยี บขอ มูลทต่ี องการคน หา (key) การคนหาเร่ิมตนดว ยการเปรยี บเทียบ key กับขอ มูล ณตําแหนง ท่อี ยูกงึ่ กลางของ array ถา key มคี า นอ ยกวาขอมลู ณ ตําแหนงนีก้ ารคนหาก็ยา ยไปคนทางซา ยของขอมูลนี้ และจะคน ทางขวาถา key มคี า มากกวา ขอมูลทต่ี ําแหนง น้ี การคน หาจะดาํ เนินไปจนกวาจะคนพบ นัน่ ก็คือ key มคี า เทากบั ขอมลู ท่ตี าํ แหนง น้นั หรือไมก ย็ ตุ ิการคนถา ไมม ขี อมูลนัน้ ใน arrayส่ิงทสี่ ําคัญในการคนหาแบบนก้ี ็คอื ขอ มูลจะตองมกี ารจดั เกบ็ แบบจดั เรยี งจากนอ ยไปหามาก เพราะถาไมอยูในรปู แบบนแี้ ลว การคน หาก็จะทาํ ไมไดวิธกี ารคน หาดว ย binary search จะลดจาํ นวนคร้ังของการเปรยี บเทยี บลงไปทีละครึง่ ทาํ ใหการคนหาใชเวลานอยลง ตวั อยา งเชน การคนหาใน array ท่ีมขี อมูลเทากบั 1024 ตัวจะใชก ารเปรยี บเทียบเพยี ง 10ครั้ง ครัง้ แรกลดลงเหลือ 512 ครัง้ ทส่ี องเหลอื 256 และคร้งั ตอ ๆ ไปเหลอื 128 64 32 16 8 4 2 และ 1จะเหน็ วาลดลงมาก ซ่ึงเปนจุดแขง็ ของการคน หาของ binary search โปรแกรม BinSearch.java แสดงการคนหาดวยการใช binary search/* BinSearch.java */import java.io.*;class BinSearch { public static void main(String[] args) { int[] list = {1, 2, 3, 4, 5, 6, 7, 8 ,9, 10}; //generate key to search int key = (int)(Math.random() * 10 + 1); int low = 0; //lower index int high = list.length - 1; //higher index int middle; //number at the middle (pivot) boolean found = false; //indicate search result while(low <= high) { middle = (low + high) / 2; //calculate pivot if(key == list[middle]) { //if found - stop searching found = true; break; } else if(key < list[middle]) //key is in lower half high = middle - 1; else low = middle + 1; //key is in upper half } if(found) System.out.println(\"Found \" + key + \"!\"); else System.out.println(key + \" not found!\"); }} ภาควิชาคอมพิวเตอรธุรกจิ วทิ ยาลยั ฟารอ สี เทอรน
บทท่ี 4 การใช Array และ String 109เริ่มตน กับ Javaโปรแกรม BinSearch.java ของเราเร่มิ ตนดว ยการกําหนดให array list มขี อมูลเปน จาํ นวนเทา กบั 10 ตวัและกาํ หนดใหข อ มูลท่ีตองการคนหา (key) มาจากการสุม หลังจากนน้ั กก็ าํ หนดให index หวั (low) และทา ย (high) ของ array เปน 0 และ list.length – 1 ตามลาํ ดบั เราจะใช while loop เปนตวั เขา หาขอ มลูใน array list ของเราดว ยการเปรยี บเทยี บคา ของ low กบั high ซงึ่ ถาเมื่อใดก็ตามที่คา ของ low มากกวาหรอื เทา กบั high ก็หมายความวา การคน หาของเราไมประสพผลสาํ เรจ็ คอื ไมมีขอมลู น้นั อยใู น list เรากจ็ ะยุตกิ ารทาํ งานทนั ที เราหาขอ มลู ทอ่ี ยตู รงกลางดว ยmiddle = (low + high) / 2;และเปรยี บเทยี บการคน หาท่ีประสพผลสาํ เรจ็ ดวยประโยคif(key == list[middle]) { found = true; break;}เราจะเปรยี บเทยี บและแบง ขอ มลู ออกเปน สองสวนดว ยelse if(key < list[middle]) high = middle - 1;else low = middle + 1;เราจะยา ย index ทอี่ ยหู ลังสดุ ใหเ ปน middle – 1 ถาขอมูลทเี่ ปน key นอยกวา ขอมูลท่ีอยู ณ ตําแหนงmiddle และจะยา ย low ไปอยทู ่ี middle + 1 ถา key มีคา มากกวา ขอ มลู ณ ตําแหนง middle เราจะทาํไปจนกวาจะเจอขอมลู ที่ตําแหนง middle หรอื ไมก ห็ ยดุ การทาํ งานโดยไมพ บขอมลู ท่ีตอ งการคนหาเลยการเรยี งลาํ ดบั (sort) ขอมลู ใน arrayมวี ธิ ีการหลากหลายวธิ ีทส่ี ามารถนํามาใชใ นการจดั เรยี งขอมูลใน array แตเ นอ่ื งจากวา เรายังตองศกึ ษาถงึสว นประกอบอนื่ ๆ ของ Java กอนทีเ่ ราจะนาํ เอาวธิ ีการเหลา น้นั มาใชไ ด ซง่ึ หนังสือสว นมากกจ็ ะนาํ เอาวิธีการจดั เรียงขอ มูลไปไวใ นวชิ าโครงสรางขอ มลู (ซ่งึ กเ็ ปน หนังสอื เลมตอ ไปจากหนังสอื เลม นี้) ดงั น้นั เราจะพูดถึงเฉพาะการนําเอา method การ sort ท่ี Java มใี หม าใชโดยตรงเพอื่ ใหก ารทาํ งานเปน ไปไดรวดเรว็ ยงิ่ ขน้ึเราเพยี งแตส ง array ท่ีเราตอ งการ sort ไปให method sort() ท่ี Java มใี ห ดังนี้Arrays.sort(list)โดยท่ี list เปน array ที่เราตอ งการ sort โปรแกรม Sort.java แสดงวธิ ีการเรยี กใช sort จาก classArrays//Sort.java - recursive versionimport java.lang.Integer;import java.util.Arrays;class Sort {public static void main(String[] args) {int[] list = new int[100]; //array with 100 intsint i; //loop index//populate list with random intsfor(i = 0; i < 100; i++) list[i] = (int)(Math.random() * 100 + 1); ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลยั ฟารอสี เทอรน
บทที่ 4 การใช Array และ String 110เรมิ่ ตนกบั Java //display 100 ints to screen – 20 per line for(i = 0; i < list.length; i++) { if(i % 20 == 0) System.out.println(); System.out.print(list[i] + \"\t\"); } System.out.println(); Arrays.sort(list); //calling sort from class Arrays //display again for(int j =0 ; j < list.length; j++) { if(j % 20 == 0) System.out.println(); System.out.print(list[j] + \"\t\"); } System.out.println(); }}ยังมี method อกี หลายตวั ใน class Arrays ทเี่ ราสามารถเรยี กใชไ ด ท้งั นีก้ ต็ อ งดวู า เรากําลังทาํ อะไรอยูในท่นี จ้ี ะขอพูดอีกเพยี ง method เดียวคือ binarySearch() เพราะวาเราไดพ ดู ถึงวธิ ีการเขียน code ของbinary search มากอนหนานแี้ ลว โปรแกรม BinarySearch.java แสดงถงึ วธิ ีการเรียกใช methodbinarySearch() ท่วี าน้ี//BinarySearch.java - recursive versionimport java.util.Arrays;class BinarySearch { public static void main(String[] args) { int[] list = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int key = (int)(Math.random() * 10 + 1);//key to search for int found = Arrays.binarySearch(list, key); if(found >= 0) System.out.println(\"Found \" + key + \" at index \" + found); else System.out.println(key + \" is not in the list!\"); }}เราเรียก method binarySearch() ดวย parameter 2 ตวั คือ (1) array ที่มขี อ มลู อยู – ในท่นี ค้ี อื listและ (2) ขอมลู ทีต่ องการคนหา – ซ่งึ กค็ ือ key ในโปรแกรมดานบนนี้ ประโยคint found = Arrays.binarySearch(list, key)ถาขอมลู ท่ีตองการคน หาอยูใน list การเรียก method binarySearch() กจ็ ะไดคาของ index ทข่ี อ มูลน้ันอยสู งกลบั มายงั ตัวแปร found แตถ า หาไมเจอคาทส่ี ง กลับจะมคี า นอยกวา 0 เสมอ ดังนั้นการแสดงผลจงึตอ งเปรียบเทยี บคาของ found กับคาของ 0เมอ่ื ทดลอง run ดผู ลลพั ธท ี่ไดค ือFound 3 at index 2Found 1 at index 0 ภาควิชาคอมพิวเตอรธ ุรกจิ วิทยาลัยฟารอีสเทอรน
บทท่ี 4 การใช Array และ String 111เริม่ ตน กบั Javaการสรา ง array ท่ีมขี อมูลเปน array (Array of arrays)เราไดใ ช array ท่ีมีขอ มูลเปน primitive type จากตัวอยางกอ นหนา น้หี ลาย ๆ ตวั อยาง เรามาลองดกู ารสราง array ทม่ี ขี อมูลเปน array ดู เราจะเรมิ่ ตน ดว ยการประกาศ ดงั นี้int[][] table = new int[5][5];ซง่ึ หมายถงึ การประกาศใหตวั แปร table เปน array ท่มี ขี อ มลู 5 ตวั โดยทแี่ ตละตวั น้ันเปน array ที่เกบ็ขอ มูลท่ีเปน int อยู 5 ตัว เราจะใช [][] สองตัวเปน ตัวบอกให Java รูวาตัวแปรตวั น้ีคอื array ทใี่ ชเ ก็บarray โดยทวั่ ไปเรามกั จะเรยี ก array ในลกั ษณะนว้ี า array 2 มติ ิ ภาพท่ี 4.2 แสดงถงึ เน้อื ท่ขี อง arraytableชือ่ ของ array index ของขอ มลู ในแตล ะแถวและ ตําแหนงของ [0] [1] [2] [3] [4]ขอ มูลแตล ะตวั(index) table[0] table[1] table[2] table[3] table[4] int [] [] table = new int [5] [5];ภาพที่ 4.2 การสราง array ที่เกบ็ array (array 2 มิต)ิโปรแกรม Array9.java ทเ่ี หน็ ดานลา งนแ้ี สดงการใช array 2 มติ ิ โดยกาํ หนดใหมีขนาด 5 x 5 และกําหนดใหขอ มูลมีคา อยรู ะหวาง 1 ถึง 10 ดวยการสุม จาก random()ความยาวหรือขนาดของ table หาไดจ ากคา คงทท่ี ่ีเกบ็ ไว length เชนเดียวกนั กบั array 1 มิติ สวนขนาดของขอ มลู ทีอ่ ยใู นแตล ะแถวหาไดจากคา คงท่ใี นแถวน้นั เชนtable[0].lengthtable[3].lengthโปรแกรม Array9.java ใช table[i].length เปน ตวั กําหนดขนาดในแตละแถวโดยท่ี i เปน index ของแถวน้ัน ๆ/* Array9.java */import java.io.*; ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลัยฟารอีสเทอรน
บทท่ี 4 การใช Array และ String 112เร่ิมตนกบั Javaclass Array9 { public static void main(String[] args) { int[][] table = new int[5][5]; for(int i = 0; i < table.length; i++) { for(int j = 0; j < table[i].length; j++) table[i][j] = (int)(1 + Math.random() * 10); } for(int i = 0; i < table.length; i++) { for(int j = 0; j < table[i].length; j++) System.out.print(table[i][j] + \"\t\"); System.out.println(); } }}ผลลัพธข องการ run โปรแกรม Array9.java คือ7328758548768627 10 9 7 510 4 4 2 2เรามาดูโปรแกรมตัวอยา งอีกตวั หน่งึ ทปี่ ระกาศและกาํ หนดคาใหกบั array 2 มิตดิ ว ยการกําหนดแบบอัตโนมตั จิ าก Java เอง/* Array10.java */import java.io.*;class Array10 { public static void main(String[] args) { //declare 2-D array with specific data int[][] table = { {1, 2, 3}, {5, 6, 8}, {7, 4, 6}, {4, 8, 9} }; for(int i =0 ; i < table.length; i++) { for(int j = 0; j < table[i].length; j++) System.out.print(table[i][j] + \"\t\"); System.out.println(); } }}เรากําหนดให table เปน array 2 มิตทิ ีม่ จี ํานวนแถวเทา กบั 4 และจาํ นวนขอ มลู ในแตล ะแถวเทา กับ 3โดยการกําหนดนัน้ เราตองใสข อ มูลในแตล ะแถวในเครื่องหมาย {} และแบง ขอ มลู ทอี่ ยแู ถวในแตล ะแถวดวยเครอ่ื งหมาย , ดังนี้int[][] table = { {1, 2, 3}, /* แถว 0 */ {5, 6, 8}, /* แถว 1 */ {7, 4, 6}, /* แถว 2 */ ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลัยฟารอ ีสเทอรน
บทท่ี 4 การใช Array และ String 113เริม่ ตน กับ Java {4, 8, 9} /* แถว 3 */ };เราสามารถทจี่ ะใหข อ มูลอยใู นบรรทดั เดยี วกนั ได เชนint[][] table = {{1, 2, 3}, {5, 6, 8}, {7, 4, 6}, {4, 8, 9}};หลังจาก run โปรแกรมแลว ผลลัพธท ่ไี ดค อื123568746489การใช array ทม่ี จี าํ นวนของขอมลู ในแตละแถวไมเทากันเราสามารถทจี่ ะกําหนดใหขอ มลู ในแตละแถวของ array มจี าํ นวนไมเทากนั ได ดังตัวอยา งดานลา งน้ีdouble [][] list = new double[5][];ซง่ึ เปน การประกาศ array 2 มิติที่มจี ํานวนแถวเทา กับ 5 แตจ าํ นวนของขอมูลในแตละแถวยังไมไ ดถูกกาํ หนด เราอาจกําหนดใหขอ มลู ในแถว 0 มจี าํ นวนเทา กับ 4 และขอมลู ในแถว 4 มจี าํ นวนทา กบั 10 เปนตน ดงั นี้list[0] = new double[4];list[4] = new double[10];สวนขอ มูลในแถวท่เี หลืออยูก แ็ ลวแตว าเราอยากที่จะใหม ีขอ มูลก่ตี วั หรอื เราอาจกําหนดใหข อ มลู ในแตล ะแถวมจี าํ นวนเทา กับคาท่ีเพิ่มขน้ึ ตามคา ของแถว (index) เชนint m = 0;while(m < 5) { list[m] = new double[m + 1]; m++;}โปรแกรม Array11.java สรา ง array 2 มติ ิทมี่ ขี อ มูลในแตละแถวเทากบั คาของ index ในแถวน้ัน ๆ/* Array11.java */import java.io.*;class Array11 { public static void main(String[] args) { double [][]list = new double[5][];//allocate space for each rowint m = 0;while(m < 5) { list[m] = new double[m + 1]; m++;}for(int i = 0; i < list.length; i++) { for(int j = 0; j < list[i].length; j++) System.out.print(list[i][j] + \"\t\"); System.out.println(); ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลัยฟารอ ีสเทอรน
บทท่ี 4 การใช Array และ String 114เร่ิมตนกบั Java } }}เมื่อ run ดูผลลพั ธทีไ่ ดค ือ0.00.0 0.00.0 0.0 0.00.0 0.0 0.0 0.00.0 0.0 0.0 0.0 0.0การกาํ หนดขนาดของ array แบบนี้ทาํ ใหก ารใชเนือ้ ที่ในการเก็บขอมูลในแตละแถวมปี ระสทิ ธิภาพมากขึ้นท้งั นี้กเ็ พราะวา เราใชเฉพาะเนือ้ ที่ทจี่ ําเปนตอ งใชเทา นัน้ ถาเราใชการกาํ หนดแบบเกา เราตองใชหนว ยความจาํ เทากบั 8 x 25 = 200 byte แตถ า เราใชการกาํ หนดตามเทา ท่ีใช เราก็จะใชห นว ยความจาํเพยี งแค 8 x 15 = 120 byteการสราง array ทีม่ คี วามจุของขอมูลในแตล ะแถวไมเทา กนั เออื้ อํานวยความสะดวกในการจองเน้ือที่ ทาํใหก ารใชห นว ยความจาํ มีประสทิ ธิภาพมากยง่ิ ขน้ึ แตการทาํ งานจะตองมีการระมดั ระวังเปนพเิ ศษ เพราะจํานวนของขอมูลในแตล ะแถวมจี าํ นวนไมท า กนั ผูอา นตองใชค วามละเอียดในการออกแบบ ถา ตองการใชarray แบบนี้ตัวอยา งการใช Array of arrays ในการหาคา max คา min และคา เฉลย่ี//ArrayOfArrays.javaimport java.io.*;class ArrayOfArrays {public static void main(String[] args) {//inititial scoresint [][]score = { {45, 87, 68, 57}, {98, 70, 58, 69}, {85, 42, 68, 82} };double average; //average of scoresint max, min, total = 0; //maximum, minimum, total of scoresint count = 0; //total scoresmax = score[0][0]; //assuming max score is at [0][0]min = score[0][0]; //assuming min score is at [0][0]//looping for 3 rowsfor(int i = 0; i < score.length; i++) { //looping for 4 columns for(int j = 0; j < score[i].length; j++) { if(score[i][j] > max) //find max score max = score[i][j]; if(score[i][j] < min) //find mim score min = score[i][j]; total += score[i][j]; //calculate total count++; //number of scores }}//calculate average of scoresaverage = (double)total / count;System.out.println(\"Maximum score is \" + max);System.out.println(\"Minimun score is \" + min);System.out.println(\"Average score is \" + average); ภาควิชาคอมพิวเตอรธ รุ กจิ วทิ ยาลยั ฟารอ สี เทอรน
บทที่ 4 การใช Array และ String 115เรม่ิ ตน กบั Java }}โปรแกรม ArrayOfArrays.java กาํ หนดให score เปน array ทเี่ ก็บขอมูลเปนจาํ นวนเทา กบั 3 แถว แถวละ 4 ตวั เราจะหา score ทีเ่ ลก็ ทสี่ ดุ score ทีใ่ หญทสี่ ดุ รวมไปถงึ การคาํ นวณหาคา เฉลีย่ ของ scoreทงั้ หมด เราใช for – loop 2 ตัวในการเขา หา array ของเราเหมือนเดิม พรอ มทง้ั ตรวจสอบวา score ตวัไหนเปน max และ score ตัวไหนเปน min ดว ยการกําหนดใหท งั้ สองตวั แปรมีคา เปนขอ มลู ตวั แรกสดุ ท่ีอยใู น array และจะทาํ การเปรยี บเทยี บขอมลู ณ ตําแหนงทงั้ หมดใน array กับขอ มูลน้ี ประโยคif(score[i][j] > max) max = score[i][j];จะเปลีย่ นคา ของ max ใหมีคา เทากับ score[i][j] ถาขอ มลู ทต่ี าํ แหนงนมี้ ากกวาคา ของ max และประโยคif(score[i][j] < min) min = score[i][j];จะเปลย่ี นคา ของ min ใหมีคาเทากับ score[i][j] ถา ขอ มลู ทต่ี าํ แหนงนี้นอยกวา คา ของ min วธิ กี ารหาคาของ max และ min แบบน้ีสามารถนาํ ไปใชไ ดก บั การหาคา max และ min โดยทว่ั ไปไดโดยไมต อ งสนใจวา ขอมูลทอ่ี ยูภ ายใน array จะมี range อยชู วงไหน ท้ังน้เี พราะเราใชข อมูลตวั แรกสุดเปนตวั ตรวจสอบกอ น ทาํ ใหการหาคาของทั้ง max และ min เปน ไปไดโดยไมต อ งกาํ หนดคา ใหกบั ตัวแปร max หรอื minใด ๆ ท้งั ส้ิน (ถา เราไมตอ งการตรวจสอบเอง เรากส็ ามารถทจี่ ะเรยี กใช method max() และ min() ท่ีมอี ยูใน class Math ได – ดใู นบทกอ น ๆ) ในสว นของการหาคา เฉล่ียก็เหมอื นกบั ทเ่ี ราไดเ คยทาํ มาแลว กอนหนา นี้การใช array of arrays นนั้ ก็เหมือนกับท่ีเราใชต าราง หรอื table ในการเก็บขอมูลตา ง ๆ หนังสอื หลาย ๆเลม เรยี ก array of arrays ทีม่ แี ค row และ column วา array 2 มิติ (two dimensional array) สว นarray of arrays ที่มีขอ มลู เปน array อกี เราก็มักจะเรียกวา array 3 มติ ิ เปนดงั นท้ี ุกครั้งที่มกี ารเพิม่ มิติใหก บั array แตก ารมองเหน็ หรือการใชก ็คงมนี อย ถา หากวา จํานวนมิตทิ ใ่ี ชม ีมากกวา 3 มิติ เพราะวาคนเราชินกับการมองเหน็ แบบ 3 มิตติ ลอดเวลา (เราจะทิ้งใหผ ูอานศกึ ษาในเรอ่ื งของ array 3 มิตเิ อง)การใช Stringการใช string นน้ั สามารถทาํ ไดห ลาย ๆ วธิ ี และวิธีแรกท่เี ราจะทาํ ความรูจักน้ันเปนการใช array เปน หลักในการทํางานกบั string นัน้ ๆ เราคงไมสามารถทจ่ี ะเรยี ก string ในลักษณะน้ไี ดเ ต็มปากเตม็ คํามากนกัเพราะวา โดยความเปนจรงิ แลว array ท่เี ราใชใ นการทาํ งานท่ีเก่ียวของกบั String นน้ั ไมใช stringโดยตรงแตเ ปน array ท่ีเก็บ char หลาย ๆ ตวั ไว หรอื ท่เี รยี กกันวา array of characters ซงึ่ หนงั สอืหลาย ๆ เลมกม็ ักจะเรยี ก string วา array of characters เราจะตรวจสอบวิธีการใช string แบบนี้พอสังเขป แลว เราจะกลบั มาพดู ถงึ String ของ Java อยางละเอยี ดอีกทหี น่ึงArray of charactersการประกาศ string แบบน้ีทาํ ไดงาย ๆ เหมอื นกับทเี่ ราประกาศใช array ทเ่ี ก็บขอมูลชนดิ อนื่ เพียงแตเราเปล่ยี นให array เก็บ char แทนเทาน้นั เชนchar [] string = new char[20];การประกาศดานบนนเ้ี ปน การสรา ง array ที่ใชเกบ็ char จํานวนเทากับ 20 ตัว โปรแกรมตวั อยา งดานลา งแสดงการใช array of characters//ArrayOfChars.javaimport java.io.*;class ArrayOfChars { public static void main(String[] args) { ภาควิชาคอมพิวเตอรธุรกจิ วิทยาลัยฟารอีสเทอรน
บทท่ี 4 การใช Array และ String 116เร่มิ ตนกับ Java //declare array of char char[] str = new char[26]; int i = 0; //populate str with characters a to z for(char c = 'a'; c <= 'z'; c++) { str[i] = c; i++; } //print all characters to screen for(i = 0; i < 26; i++) System.out.print(str[i]); System.out.println(); }}โปรแกรม ArrayOfChars.java เร่มิ ตน ดว ยการสราง array of chars จํานวน 27 ตัวจากประโยคchar[] str = new char[26];หลงั จากน้ันก็ใช for – loop ในการกาํ หนดคา ใหกบั ทุก ๆ ตาํ แหนงของ str ดว ยการใช char เปน indexของ loop เนือ่ งจากวา การเพม่ิ คา ใหกบั char นัน้ ทีจ่ ริงแลว เปน การเพมิ่ คา ใหก ับตวั เลขท่เี ปนตัวแทนของตวั อกั ษรน้นั ๆ เชน ถาเรากําหนดให char c = 'f' การเพม่ิ คา ใหกบั c หน่งึ คร้งั จะทําให c มคี าเปน 'g' ซึง่เปนตวั อกั ษรทอี่ ยูถ ดั ไปในตาราง ASCII เพราะฉะนนั้ การใช for – loop นี้ก็ทําใหเ กดิ การกาํ หนดคาใหกบัstr ทกุ ตาํ แหนงfor(char c = 'a'; c <= 'z'; c++) { str[i] = c; i++;}ผอู า นคงเดาไดว าผลลพั ธของโปรแกรมตวั น้ีคอื อะไร Æ abcdefghijklmnopqrstuvwxyzการใช array of characters นนั้ ไมค อ ยจะสะดวกมากนกั ท้งั น้เี พราะเปนการทาํ งานทเ่ี กย่ี วกบั array เราอยากท่ีจะมี string จริง ๆ ท่ีเราสามารถทจ่ี ะทาํ กระบวนการตา ง ๆ ได เชน บวก string 2 ตวั เขาดวยกนัหรือตรวจสอบความเทา กนั ความเหมอื นกนั ของ string อยางนเี้ ปน ตน และ Java ก็มี class String ใหเ ราเรยี กใชงานที่เกย่ี วของกับ string โดยตรงString ใน JavaString ใน Java น้นั เปน object ดงั นน้ั เราจึงจาํ เปน ตองเรียกใช class String ในการสราง string เพือ่ การใชง านของเรา เชน เราอาจตอ งการเกบ็ ชือ่ ของ user ไวในโปรแกรม หรอื สง ขอความทเี่ ปน string ไปใหuser อยางนี้เปน ตนการประกาศใช String กไ็ มยาก ซึง่ ทําไดด งั น้ีString str = new String(\"Java is fun\");หรอื แบบน้ีString str = \"Java is fun\";โดยเฉพาะการประกาศในประโยคทส่ี องนี้ มผี ลเทา กบั ประโยค 2 ประโยคตอไปน้ีchar[] str = {'J', 'a', 'v', 'a', ' ', 'i', 's', ' ', 'f', 'u', 'n'};String str = new String(str); ภาควิชาคอมพิวเตอรธ ุรกจิ วิทยาลยั ฟารอสี เทอรน
บทท่ี 4 การใช Array และ String 117เริ่มตน กบั Javaจะเห็นไดว า string กค็ ือ array of chars นั่นเอง บางครั้งการประกาศตวั แปร string โดยทไี่ มม ีการกาํ หนดคา ใหก บั string นัน้ เรากท็ าํ ไดด วยการประกาศเหมอื นกบั การประกาศตวั แปรชนดิ อน่ื เชนString name;ซึง่ มีความหมายวา ตวั แปร name เปน string ทไี่ มไ ดอ า งถงึ คาใด ๆ เลย และถาเรา compile โปรแกรมท่ีมกี ารประกาศแบบนี้จะมี error เกดิ ขนึ้ วธิ กี ารแกไขเพอ่ื ไมใ ห Java ฟอ งตอน compile เราตอ งกําหนดคาnull ใหก ับ string name ดังน้ีString name = null;ซึ่งบอกให Java รวู า string name ไมไดอ า งถงึ ขอมูลใด ๆ เลย เราสามารถทีจ่ ะอา งถึงขอมลู ใด ๆ ก็ไดหลงั จากน้นัลองมาดูโปรแกรมตัวอยา งการทาํ งานกับ string//StringOps.javaimport java.io.*;class StringOps { public static void main(String[] args) { String first = \"Java \"; String second = \"Programming\"; String third = null; int percent = 100; third = first + second; System.out.println(third + \" is \" + percent + \"% fun!\"); }}โปรแกรม StringOps.java ประกาศตวั แปรท่เี ปน String 3 ตวั คอื first second และ third โดยกาํ หนดใหfirst มีคาเปน \"Java \" second มคี า เปน \"Programming\" และ third ไมมคี า อางอิงถึง string ใด ๆ พรอมกันนี้เราไดก ําหนดใหต ัวแปร percent มคี า เปน 100 ประโยคthird = first + second;ทําการรวม first และ second เขา ดว ยกนั ซงึ่ ทาํ ให third มคี า เปน \"Java Programming\" และในประโยคทีท่ าํ การแสดงผลไปหนา จอนนั้ เราไดเพ่ิมการแสดงผลคา ของตัวแปร percent และ string คงทต่ี วั อนื่ เขาไปดว ยเพ่อื ใหผ ลลพั ธเปนJava Programming is 100% fun!เราสามารถทจี่ ะรวมคาของตวั แปรอื่นทไี่ มใ ช string เขา กบั string ไดดังนี้ สมมตวิ าเราเพม่ิ ตัวแปรตอ ไปนี้int percent = 100;String is = \" is \";String fun = \"%fun!\";และเรารวม String และ int เขาดวยกนั ดว ยประโยคthird = first + second + is + percent + fun; ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลัยฟารอีสเทอรน
บทที่ 4 การใช Array และ String 118เร่มิ ตน กับ Javaเรากจ็ ะไดผ ลลพั ธเ หมือนกันกับท่ีเราไดท ํากอ นหนานี้ สาเหตทุ ่ีทาํ ไดเ พราะ Java จะเปลย่ี น int ใหเ ปนstring กอนท่จี ะรวมเอา string ทง้ั หมดเขาดว ยกันการเปรียบเทยี บ Stringเราไมส ามารถท่ีจะเปรยี บเทยี บ string 2 ตัวดวยการใช == ไดเ หมือนกับทเี่ ราทาํ กบั ตัวแปรที่เปนprimitive type ได เชนfirst == thirdเพราะวาประโยคดงั กลา วจะเปรยี บเทยี บวา string ท้งั สองตวั อางถงึ ท่ีเดยี วกนั หรือไม (ทท่ี ี่เก็บ string ใดstring หน่ึง) เชน ถาเรามีString myString = \"Motorcycle\";String yourString = myString;ซ่งึ ทาํ ใหต วั แปร myString และ yourString อางถงึ ขอมลู เดียวกัน (และจะใหคา true ถา มกี ารเปรยี บเทยี บดวย ==) ไมใ ชก ารเปรยี บเทียบถงึ ขอ มลู ทตี่ ัวแปรท้ังสองอางอยู เชน ถา เรามี string ตอ ไปน้ีString keyboard = \"from Thailand\";String kb = \"from Thailand\";ถา เราเปรยี บเทยี บดว ยการใชif(keyboard == kb) …เราจะไดค า false ถึงแมวาตวั แปรทง้ั สองจะมีคาที่เหมอื นกนั ท้ังนีเ้ พราะวา เคร่ืองหมาย == จะเปรยี บเทยี บคา อา งอิง (ท่อี ยู หรือ address ในหนว ยความจาํ ) ของตัวแปรทง้ั สองไมใชค า ทที่ ง้ั สองตวัแปรเก็บไว เราตอ งใช method อ่ืนท่ี Java มีใหใ น class Stringโปรแกรมตวั อยา งของการเปรยี บเทียบ string//StringCompare.javaimport java.io.*;class StringCompare { public static void main(String[] args) { String first = \"Java \"; String second = \"Programming\"; String third = \"Java Programming\"; String forth; forth = first + second; //forth is \"Java Programming\" if(third == forth) System.out.println(\"third and forth refer to the same string\"); else System.out.println(\"third and forth do not refer to the same string\"); first = forth; //first and forth refer to the same string System.out.println(\"first is \" + first); System.out.println(\"forth is \" + forth); if(first == forth) System.out.println(\"first == forth is true\"); else ภาควิชาคอมพิวเตอรธุรกิจ วิทยาลัยฟารอสี เทอรน
บทท่ี 4 การใช Array และ String 119เรม่ิ ตนกับ Java } System.out.println(\"first == forth is false\");}โปรแกรม StringCompare.java แสดงถงึ การเปรยี บเทยี บ string ดว ยการใชเ ครอ่ื งหมาย == ถาเราสังเกตใหด จี ะเหน็ วา string third และ forth มคี าท่เี หมอื นกนั (string ท่ีประกอบไปดวย char ท่ีเหมอื นกนั หมด) เมือ่ run ดูผลลพั ธท่ีไดคือthird and forth do not refer to the same stringซึ่งบอกใหเ รารวู า การใชเครอ่ื งหมาย == เปรียบเทียบความเหมอื นหรือความแตกตา งของ string ไมไดเชน เดียวกนั กบั ประโยคเปรียบเทยี บถดั มาในโปรแกรม เรากาํ หนดให first อา งถงึ ขอ มูลทเี่ ดยี วกนั กบัforth และเม่อื เรา run ผลลัพธท ี่ไดกเ็ หมอื นกบั ท่เี ราไดค าดหวังไวคือfirst is Java Programmingforth is Java Programmingfirst == forth is trueถาเราตอ งการทจ่ี ะเปรยี บเทยี บ string จรงิ ๆ เราตองใช method equals() และ method compareTo()ดงั โปรแกรมตัวอยางตอ ไปนี้//StringCompare1.javaimport java.io.*;class StringCompare1 { public static void main(String[] args) { String first = \"Java \"; String second = \"Programming\"; String third = \"Java ProgramminG\"; String forth; forth = first + second; //forth is \"Java Programming\" if(third.equals(forth)) System.out.println(\"third equals forth\"); else System.out.println(\"third not equals forth\"); first = forth; //first and forth refer to the same string if(first.equals(forth)) System.out.println(\"first equals forth\"); else System.out.println(\"first not equals forth\"); }}เราไดเปลี่ยนให third มีคา เปน \"Java ProgramminG\" เพ่อื ทจี่ ะแสดงใหเหน็ วาในการเปรยี บเทยี บน้ันchar ทุกตัวจะตอ งเหมือนกัน ผลลัพธท เี่ ราไดจากการ run คอืthird not equals forthfirst equals forthเราใชประโยค third.equals(forth) ในการเปรยี บ third และ forth วา มีคาทเ่ี หมือนกนั (เทากนั ) ซ่งึ ถาเทา กันจรงิ ผลลพั ธท ไ่ี ดจากการเปรียบจะมคี า เปน true และจะใหค า false ถาไมเทากันการเปรยี บเทยี บ string 2 ตวั เพอื่ ตรวจสอบความเทา กนั น้นั เราจะเอาตวั ไหนอยูดานหนา กไ็ ด เชน ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลัยฟารอ ีสเทอรน
บทที่ 4 การใช Array และ String 120เร่มิ ตนกบั Javathird.equals(forth) หรอื forth.equals(third) ก็ไดmethod equals() จะตรวจสอบตัวอักษรทกุ ตวั ที่อยใู น string โดยใหค วามสนใจในเร่อื งของตัวอกั ษรวาเปนตัวอกั ษรตัวเลก็ หรอื ตวั ใหญ การตรวจสอบจะใหค าท่เี ปนจรงิ ถาเหมือนกันทั้งรปู รางและขนาด เชน gหรอื G ไมใ ชตวั อกั ษรตวั เดยี วกัน การตรวจสอบจะเปน falseในการเปรยี บเทยี บบางครั้งเรากไ็ มสนใจวาตวั อกั ษรทีอ่ ยภู ายใน string นน้ั เปน ตัวเล็กหรือตัวใหญ ซ่งึ ถาเราตองการเพยี งแตตรวจสอบถึงความเหมอื นทางรูปรา งเรากต็ อ งใช method equalsIgnoreCase() ในการเปรียบเทยี บ string นน้ั ๆถาเราเปลยี่ นการเปรยี บเทยี บในโปรแกรมตัวอยา งกอ นหนานจี้ ากการใช equals() มาเปนequalsIgnoreCase() ดงั น้ีif(third.equalsIgnoreCase(forth)) System.out.println(\"third equals forth\");else System.out.println(\"thrid not equals forth\");เรากจ็ ะไดผ ลลพั ธเ ปนthird equals forthการเปรียบเทยี บความไมเทา กัน (มากกวา หรือ นอยกวา ) ของ stringหลาย ๆ คร้ังเราตองตรวจสอบถึงความมากกวา หรือ นอยกวา ของ string เพ่อื ใหการจดั เกบ็ string นั้น ๆอยใู นรูปแบบทมี่ กี ารจัดเรยี ง ไมว า จะเปน จากนอยไปหามาก หรอื มากไปหานอย ในการตรวจสอบวาstring ตวั ไหนมากกวา หรอื นอ ยกวา กันนัน้ เราจะใช method compareTo() เชนmyString.compareTo(yourString);สมมตวิ า myString มคี า เปน \"lovely bike\" และ yourString มคี าเปน \"lovely kite\" การเปรยี บเทยี บดว ยcompareTo() จะใหค า ทีเ่ ปนบวก ท้ังนี้ก็เพราะวา ตัวอกั ษร 'k' ใน yourString นนั้ มีคา มากกวา ตัวอักษร'b' ใน myString เรามาดโู ปรแกรมตัวอยา งการใช method compareTo() กันดกี วา//StringCompareTo.javaimport java.io.*;class StringCompareTo { public static void main(String[] args) { String first = \"lovely bike\"; String second = \"lovely kite\"; String third = \"lovely\"; //compare first and second if(first.compareTo(second) > 0) System.out.println(\"first is greater than second\"); else System.out.println(\"second is greater than first\"); //compare first and third if(first.compareTo(third) > 0) System.out.println(\"first is greater than third\"); else System.out.println(\"third is greater than first\"); String a = \"A\"; ภาควิชาคอมพิวเตอรธ ุรกจิ วทิ ยาลยั ฟารอ สี เทอรน
บทท่ี 4 การใช Array และ String 121เร่ิมตน กับ Java String z = \"Z\"; String str1 = \"AAA\"; String str2 = \"AAA\"; //compare a and z if(a.compareTo(z) < 0) System.out.println(a + \" is less than \" + z); //compare str1 and str2 if(str1.compareTo(str2) == 0) System.out.println(str1 + \" equals \" + str2); }}ผลลพั ธท เี่ ราไดจากการ run คอืsecond is greater than firstfirst is greater than thirdA is less than ZAAA equals AAAโปรแกรมของเราเปรียบเทยี บ first กบั second ดวยการตรวจสอบคาทไ่ี ดจ ากการเปรียบเทยี บกับ 0 ซ่งึ ถาfirst มากกวา second ประโยคนี้ก็จะเปน true แตเ นื่องจากวา first นั้นไมมากกวา second การเปรียบเทยี บของเราจงึ ใหผ ลลพั ธเ ปน false Java จงึ ประมวลผลประโยคทอี่ ยใู น else (สง ผลลพั ธไปหนา จอ) – การประมวลผลประโยคอน่ื ๆ ก็คลา ยกันโดยทว่ั ไปเราจะเปรียบเทยี บคา ที่ไดจ าก method compareTo() กับ 0 เสมอเพราะจะทําใหเราไดค า trueหรือ false ท่สี ามารถนําไปใชใ นการเลือกประมวลผลประโยคตาง ๆ ไดต ามทเี่ ราตอ งการการเปรยี บเทยี บความเหมือนและเทา กนั ก็ทาํ ไดด ว ยการใชเ ครื่องหมาย == ดังเชนประโยคสุดทา ยของโปรแกรมif(str1.compareTo(str2) == 0) System.out.println(str1 + \" equals \" + str2);ในการเปรยี บเทียบดวย method compareTo() นคี้ าทส่ี ง กลบั มาเปนไปไดเ พียงแค 3 คา คือ -1, 0, และ1 เทา นัน้ โดยท่ี-1 หมายถึง string ทีอ่ ยูทางซา ย นอยกวา string ท่ีอยูท างขวา (string ที่เปน parameter)0 หมายถงึ string ท้งั สองนัน้ เทากัน1 หมายถึง string ท่อี ยทู างซา ย มากกวา string ทีอ่ ยูทางขวาเชน ถา เรามีประโยค string1.compareTo(string2);string1 หมายถึง string ทอ่ี ยทู างซายstring2 หมายถึง string ทอี่ ยทู างขวา หรอื string ทเ่ี ปน parameterการเขา หาตวั อักษรทอ่ี ยใู น stringเราสามารถทจี่ ะเขาหาตวั อกั ษรตา ง ๆ ท่อี ยูใ น string ไดดวยการใช method ตา ง ๆ ดงั ทไ่ี ดแสดงไวเ ปนตัวอยา งในโปรแกรม StringChars.java//StringChars.javaimport java.io.*; ภาควิชาคอมพิวเตอรธ รุ กิจ วทิ ยาลัยฟารอีสเทอรน
บทท่ี 4 การใช Array และ String 122เรม่ิ ตนกบั Javaimport java.lang.Character;class StringChars { public static void main(String[] args) { //setting up constant string String string = \"Learn to write programs in Java doesn't take\" + \" as long as I think it would. But to fully understand\" + \" it is a time consuming task.\";int charCount = 0; //count of lettersint vowelCount = 0; //count of vowelsint lowerCaseCount = 0; //count of lowercase lettersint upperCaseCount = 0; //count of uppercase lettersint spaceCount = 0; //count of white spaces//check all lettersfor(int i = 0; i < string.length(); i++) { char ch = string.charAt(i); //check if it's a letter if(Character.isLetter(ch)) charCount++; //check if it's an uppercase if(Character.isUpperCase(ch)) upperCaseCount++; //check if it's a lowercase if(Character.isLowerCase(ch)) lowerCaseCount++; //check if it's a white space if(Character.isWhitespace(ch)) spaceCount++; //convert it to lowercase ch = Character.toLowerCase(ch); //check if it's a vowel if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') vowelCount++;} System.out.println(charCount + \" characters counted.\"); System.out.println(upperCaseCount + \" uppercase letters counted.\"); System.out.println(lowerCaseCount + \" lowercase letters counted.\"); System.out.println(vowelCount + \" vowels counted.\"); System.out.println(charCount - vowelCount + \" consonants counted.\"); System.out.println(spaceCount + \" spaces counted.\"); }}ผลลพั ธท ี่ไดจ ากการ run คอื99 characters counted.4 uppercase letters counted.95 lowercase letters counted.37 vowels counted.62 consonants counted. ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลยั ฟารอ สี เทอรน
บทท่ี 4 การใช Array และ String 123เริม่ ตนกับ Java24 spaces counted.การทาํ งานของโปรแกรมเรม่ิ ตน ดว ยการกาํ หนดใหต วั แปร string มีคา เปนคา คงที่ที่อยใู น \" \" เราจะเขาหาตวั อกั ษรแตละตัวดวย for – loop และดึงเอาตัวอักษรออกมาจาก string แตละตัวดว ยคาํ สงั่char ch = string.charAt(i)ซึ่งจะดึงเอาตวั อักษร ณ ตาํ แหนง index i นนั้ ๆ มาเกบ็ ไวท ่ีตวั แปร ch หลังจากนั้นกต็ รวจสอบดวยmethod ตา ง ๆ ทีม่ ีอยใู น class Character เชนCharacter.isLetter(ch) ใหคา true ถา เปนตวั อักษรCharacter.isUpperCase(ch) ใหคา true ถา เปน ตัวอักษรตวั ใหญCharacter.isLowerCase(ch) ใหค า true ถาเปนตวั อักษรตัวเลก็Character.isWhitespace(ch) ใหคา true ถา เปนชอ งวาง (เคาะแปน หรอื tab)พรอ มทั้งเพ่มิ คา ใหกับตัวแปรทงั้ หลายท่เี ปน ทีเ่ กบ็ จาํ นวนครงั้ ของตวั อกั ษรตาง ๆ ท่ีปรากฏใน stringหลังจากนั้นก็เปลยี่ นตวั อักษรใหเปน ตวั เลก็ เพ่อื ใชตรวจสอบวาเปน สระในภาษาองั กฤษหรอื ไม สาเหตทุ ี่เปลย่ี นเพราะเราไมอ ยากท่จี ะเสยี เวลาในการตรวจสอบสระตวั เล็กทหี น่ึง และตัวใหญอ ีกทหี นงึ่ อยา งไรก็ตามท้ังสองก็เปน สระอยูเสมอch = Character.toLowerCase(ch);if(ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u') vowelCount++;ยังมี method อกี มากมายใน class Character และ class String ทเ่ี ราสามารถนาํ มาใชในการทํางานท่ีเกีย่ วขอ งกบั string ตัวอยา งตอ ไปน้ีเปนการคน หาคาํ (sub string) ท่อี ยใู น string ดวยการใช methodindexOf()//IndexOf.javaimport java.io.*;import java.lang.Character;class IndexOf { public static void main(String[] args) { //setting up constant string String string = \"Learn to write programs in Java doesn't take\" + \" as long as I think it would. But to fully understand\" + \" it is a time consuming task.\";int itCount = 0; //count of itString it = \"it\"; //string to seach for//search for \"it\"int index = string.indexOf(it);while(index >= 0) { itCount++; //move to first letter after last \"it\" index += it.length(); //look for next \"it\" index = string.indexOf(it, index);} System.out.println(\"it appeared \" + itCount + \" times.\"); }} ภาควิชาคอมพิวเตอรธุรกิจ วิทยาลยั ฟารอีสเทอรน
บทที่ 4 การใช Array และ String 124เริ่มตนกบั Javaผลลัพธของโปรแกรมคือit appeared 3 times.โปรแกรมของเรากําหนดให index มคี า เปนตาํ แหนงท่ี \"it\" ปรากฏอยใู น string ดว ยคาํ ส่ังint index = string.indexOf(it)เม่ือการคนหาประสพผลสําเรจ็ เราก็จะใช while – loop ในการคนหาตอไป แตก อนท่เี ราจะดาํ เนินการนั้นเราจะเพม่ิ คาหนงึ่ คา ใหกบั itCount กอน หลังจากน้นั เราจะเลอื่ น index ไปอยูในตําแหนงของตวั อกั ษรตวัแรกท่อี ยูห ลงั \"it\" ดวยคําส่งั index += it.length() เนื่องจากวา method indexOf() จะสง คา ของตาํ แหนง ของตวั อักษรตวั แรกของ \"it\" มาให เสร็จแลวกท็ าํ การคนหาตอไปดว ยคําสัง่index = string.indexOf(it, index)ทําการคน หาไปจนกระทั่งหมด string เราก็ออกจาก while – loopในการใช indexOf() คนหานนั้ เราตอ งเปรยี บเทียบคา ทส่ี งกลบั มากบั 0 เพราะถา หาไมเ จอคาของ indexกจ็ ะเปน -1 ทําใหเ ราหลดุ ออกจาก while – loop ไดMethod indexOf() นน้ั มอี ยสู องตัวทร่ี ับเงอื่ นไข (parameter) ไมเ หมอื นกัน ดงั ที่เหน็ ในโปรแกรม ตวั แรกรับเพียงคา เดยี วคอื sub string ท่ตี อ งการคน หา สว นตวั ทส่ี องรับคาสองคา คือ sub string ที่ตองการคน หา และ จดุ (index) เร่มิ ตน ของการคนหา ซงึ่ ถาสงั เกตใหดีเราใช indexOf() ตวั แรกในการคนหาครัง้แรก และตัวทส่ี องในการคนหาตวั ตอ ๆ ไป ทงั้ น้ีก็เพราะวา ครั้งแรกสดุ เราไมร วู า คาของ index แตในครัง้ ที่สองนั้นเราไดค า ของ index แลวผูอา นตองจําไวเ สมอวา indexOf() จะสงคา -1 มาใหถ า ไมมี sub string ใน string นน้ั ๆและจะสงคา ของตาํ แหนง ท่ี sub string น้ันอยถู ามี sub string ทีว่ าตอไปเราลองมาดโู ปรแกรมทท่ี ําการดึงเอากลมุ ของตวั อักษร (คํา) หรือทเ่ี รยี กวา sub string ออกจากstring ดู//SubString.javaimport java.io.*;import java.lang.Character;class SubString { public static void main(String[] args) { //setting up constant string String string = \"Learning Java\";String str1 = string.substring(0); //the whole stringString str2 = string.substring(9); //string: \"Java\"String str3 = string.substring(0, 8); //string: \"Learning\" System.out.println(\"str1 > \" + str1); System.out.println(\"str2 > \" + str2); System.out.println(\"str3 > \" + str3); }}Java มี method substring() ใหเราใชอ ยสู องตวั คือ substring() ทไ่ี มมี parameter และ substring()ท่มี ี parameter อยูส องตัว โดยทต่ี วั แรกเปน index เรมิ่ ตนของ sub string และ parameter ตัวทส่ี องเปน index ตวั สดุ ทา ยที่อยูใ น sub string นน้ั แตไ มน ับตวั มนั เอง ดังท่ีไดแ สดงไวในโปรแกรม ภาควิชาคอมพิวเตอรธุรกจิ วทิ ยาลยั ฟารอสี เทอรน
บทท่ี 4 การใช Array และ String 125เริ่มตนกับ JavaString str2 = string.substring(9)หมายความถึงการเรม่ิ นบั ที่ index = 9 ไปจนถึงตวั สดุ ทา ยใน string นัน้ คอื เร่มิ ทตี่ วั อักษร 'J' ไปจบท่ีตวั อักษร 'a' ซงึ่ คอื คําวา \"Java\" สว นString str3 = string.substring(0, 8)หมายถงึ การเรม่ิ นบั ท่ี index = 0 ไปจนถึงตวั ที่ 8 คือตงั้ แตต วั อักษร 'L' ไปจนถึงตวั อักษร ' ' (space) แตไมน ับ space ดงั นัน้ sub string ท่เี ราไดกค็ อื \"Learning\"เราสามารถทจ่ี ะดงึ เอา sub string ออกจาก string ทเ่ี ปน คา คงท่ีได เชนString sub = \"Basic idea about Java\".substring(6) จะให \"idea aboutJava\"หรือString sub = \"Basic idea about Java\".substring(6, 10) จะให \"idea\"ตารางที่ 4.1 แสดงถึง method ตา ง ๆ ของ class Stringตาราง 4.1 method ของ class String ความหมายmethod ความยาวของ String (จาํ นวนตวั อักษร)length() ตําแหนงเร่มิ ตนที่ String ตวั นีอ้ ยู ถา ไมม จี ะเปน -1indexOf(String) ตาํ แหนงเร่มิ ตนท่ี String ตัวนอ้ี ยตู ามจดุ ท่ีกาํ หนด ถา ไมindexof(String, start index) มีจะเปน -1 ตาํ แหนง สดุ ทา ยของ String ตวั นี้ เทา กับ -1 ถา ไมมีlastIndexof(String) ตําแหนงสดุ ทายของ String ตวั น้ตี ามจดุ ทกี่ ําหนดlastIndexof(String, start index) เทากับ -1 ถาไมมี String ทไี่ มม ี space อยูท้ังดานหนา และหลงัtrim() คาของ String ณ ตําแหนงทก่ี าํ หนดจนจบsubstring(start index) คา ของ String ณ ตาํ แหนงทีก่ าํ หนดทงั้ สองsubstring(start index, end index) เปลยี่ น char ทกุ ตวั ดว ย char ตวั ใหมทก่ี าํ หนดreplace(old char, new char) คา ตวั อักษร ณ ตาํ แหนงทก่ี ําหนดcharAt(index) true ถา String ทัง้ สองตัวเทากันequals(String) true ถา String ทั้งสองตัวเทากนั ไมส นใจ caseequalsIgnoreCase(String) true ถา String เริม่ ตนดวย String ทกี่ ําหนดstartsWith(String) true ถา String เร่ิมตนดว ย String ทก่ี ําหนด ณstartsWith(String, start index) ตําแหนงท่กี าํ หนด true ถา String จบดวย String ทก่ี ําหนดendsWith(String)การใช class StringBuffer ในการสรา ง stringแทนทีจ่ ะใช class String เราก็สามารถที่จะใช class StringBuffer แทนได การทํางานกไ็ มแ ตกตา งกนัมากมายนัก เชน สมมตวิ าเราจะสรา ง string สักตัวหนึง่ เรากท็ าํ ได ดังน้ีStringBuffer string = new StringBuffer(\"Basic String Operations\");เราสรา ง object หน่งึ ตวั ช่ือ string จาก class StringBuffer โดยกาํ หนดคา เบอื้ งตน เปน \"Basic StringOperations\" เราไมส ามารถทจ่ี ะสรา ง string เหมือนกบั ทเ่ี ราสรา งดว ย class String ได เราตองจองเนื้อท่ีใหก ับตวั แปรดว ยคําส่งั new กอน หลังจากนน้ั กก็ ําหนดคา ใหก บั ตวั แปรน้ี เราอาจประกาศดว ยการประกาศแบบนี้ ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลัยฟารอ ีสเทอรน
บทท่ี 4 การใช Array และ String 126เริม่ ตนกบั JavaStringBuffer string = null;string = new StringBuffer(\"Just another way to declare\");แตไ มใ ชแ บบน้ีStringBuffer string = \"Just another way to declare\";ขอ ดีของการใช StringBuffer กค็ ือ เราสามารถทจ่ี ะเปล่ียนแปลง string ทีเ่ ราสรางข้ึนได (object จากclass String ทเ่ี ราใชกอนหนา น้ที ําไมได) และเรายังสามารถทีจ่ ะกําหนดขนาดของ string จาก classStringBuffer ไดต ามความพงึ พอใจของเรา ลองมาดูโปรแกรมตัวอยางการใช object จาก classStringBuffer กัน//StringBufferTest.javaimport java.io.*;class StringBufferTest { public static void main(String[] args) { //setting up constant string StringBuffer string = new StringBuffer(\"fish\"); System.out.println(\"string is \" + string); //append \"er\" after \"fish\" string.append(\"er\"); System.out.println(\"string is \" + string); //append \"man\" after \"fisher\" using method insert() string.insert(string.length(), \"man\"); System.out.println(\"string is \" + string); }}โปรแกรม StringBufferTest.java แสดงการสราง object จาก class StringBuffer ดว ยคาํ สัง่StringBuffer string = new StringBuffer(\"fish\")จะทาํ ใหค าของ string เปน fishuiuiหลังจากทเ่ี ราแสดงขอมูลที่อยใู น string แลวเรากน็ าํ เอา string \"er\" มาเชอื่ มเขากบั string \"fish\" ดว ยคาํ ส่ังstring.append(\"er\")จะทาํ ใหค าของ string เปนfisherทําใหข อ ความทอี่ ยูใน string เปลี่ยนเปน \"fisher\" และหลงั จากที่เราแสดงผลที่ไดใหมน้ไี ปยงั หนา จอ เราก็เปล่ยี นขอมูลใน string ใหมด วยการนาํ เอา string \"man\" มาเช่ือมเขากบั string ที่เราไดก อนหนาน้ีดวยการใช method insert() ดังน้ีstring.insert(string.length(), \"man\") ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลัยฟารอ ีสเทอรน
บทที่ 4 การใช Array และ String 127เริม่ ตน กับ Javaจะทาํ ใหค า ของ string เปน fishermanเราเรียก insert() ดว ย parameter 2 ตัวคอื 1). ความยาวของ string เดมิ ซงึ่ กค็ อื จุดเร่มิ ตนของการเชื่อมและ 2). string ตัวใหมท ีเ่ ราตอ งการเชื่อม คอื \"man\" เมอ่ื run ดแู ลวผลลพั ธท ีไ่ ดค ือstring is fishstring is fisherstring is fishermanเราสามารถทจ่ี ะเปลี่ยนขนาดของ object ที่มาจาก class StringBuffer ไดด งั นี้string.setLength(6)ซึ่งจะทําใหข อมูลท่อี ยใู น string เปล่ียนไป หลังจากที่เราเปลี่ยนขนาดของ string และเพ่มิ ประโยคสําหรับการแสดงผลในโปรแกรมของเราใหเปนSystem.out.println(\"string after set length is \" + string)ผลลัพธท ่ีเราจะไดจ ากการ run กจ็ ะกลายเปนstring after set length is fisherเราไมไ ดถ ูกจํากดั ใหใสข อมูลทเ่ี ปน string เทา นั้นใน object ที่มาจาก class StringBuffer เราสามารถที่จะเรียกใช append() หรือ insert() กบั ขอ มลู ชนิดอน่ื ๆ ได เชนโปรแกรมตัวอยา งตอ ไปน้ี//StringBufferTest1.javaimport java.io.*;class StringBufferTest1 { public static void main(String[] args) { //setting up constant string StringBuffer string = new StringBuffer(); string.append(2); System.out.println(\"string is \" + string); //append \" fisher\" after 2 string.append(\" fisher\"); System.out.println(\"string is \" + string); //append \"men\" after \"fisher\" using method insert() string.insert(string.length(), \"men\"); System.out.println(\"string is \" + string); string.append(\" with \"); System.out.println(\"string is \" + string); string.append(100); string.append(\" fish.\"); System.out.println(\"string is \" + string); }} ภาควิชาคอมพิวเตอรธ รุ กิจ วิทยาลัยฟารอสี เทอรน
บทท่ี 4 การใช Array และ String 128เร่มิ ตน กบั Javaเราไมไดท ําอะไรมากมายนกั เพยี งแตเรยี กใช method append() ดว ยคาทีเ่ ปน int เชนstring.append(2) หรือ string.append(100) เปนตน Java ยังยอมใหเราเช่อื มขอ มูลท่มี คี วามหลากหลายของชนดิ ของขอมูลเขาสู object ท่มี าจาก class StringBuffer ไดโ ดยไมจ าํ กัดจาํ นวนผลลัพธของโปรแกรมหลงั จากการปรับปรงุ คอืstring is 2string is 2 fisherstring is 2 fishermenstring is 2 fishermen withstring is 2 fishermen with 100 fish.สว นหนึง่ ของ class StringBuffer ท่นี าสนใจก็คือ การกาํ หนดขนาดใหกบั buffer ท่ีรองรบั ขอ มูลในobject ตาง ๆ ทีเ่ กดิ จาก class น้ี นนั่ กค็ ือ Java จะกาํ หนดขนาดของ buffer ใหเ ทา กบั ขอมลู ทมี่ ีอยูใ นbuffer บวกกับอีก 16 ตวั อักษรเสมอ เชน ถา เราสรา ง objectStringBuffer name = new StringBuffer(\"Chiang Mai\");ซึง่ มจี ํานวนตัวอักษรทง้ั หมด (นบั ชอ งวา งดว ย) เทากับ 10 ตวั Java จะจองเนอื้ ทใี่ หม ีความจเุ ทา กบั 26ตวั เราสามารถตรวจสอบความจขุ อง buffer ดว ยการเรยี กใช method capacity() ได เชน ถา เราสรางประโยคตอ ไปนี้StringBuffer s = new StringBuffer(\"Chaing Mai\");System.out.println(\"Length of \" + s + \" is \" + s.length());System.out.println(\"Capacity of \" + s + \" is \" + s.capacity());หลังจากการประมวลผล เราจะไดผลลพั ธด งั นี้Length of Chaing Mai is 10Capacity of Chaing Mai is 26ตวั อยางตอไปนี้คงเปน ตวั อยา งสุดทา ยท่เี ราจะแสดงใหเ หน็ ถงึ การใช method อกี ตวั หนึ่งในการเปล่ยี นแปลงขอ มลู ทอ่ี ยใู น string ใหอ ยูใ นรปู แบบของการกลบั หัวกลับหาง (reverse)//ReverseString.javaimport java.io.*;class ReverseString { public static void main(String[] args) { //setting up a constant string StringBuffer string = new StringBuffer(\"I love Chaing Mai\"); //create an empty string StringBuffer revStr = new StringBuffer();revStr.append(string); //append string to revStrrevStr.reverse(); //reverse it System.out.println(\"Reverse of [\" + string + \"] is [\" + revStr + \"]\"); }}ผลลพั ธข องการ run คอืReverse of [I love Chaing Mai] is [iaM gniahC evol I] ภาควิชาคอมพิวเตอรธรุ กิจ วทิ ยาลัยฟารอ ีสเทอรน
บทท่ี 4 การใช Array และ String 129เริ่มตน กบั Javaหลงั จากทีส่ ราง string ดวยคา \"I love Chiang Mai\" แลวเรากส็ ราง object อีกตวั หนึ่งโดยไมม กี ารอา งถงึ คาใด ๆ ท้ังส้ินดวยคาํ สง่ั StringBuffer revStr = new StringBuffer() หลังจากนน้ั เราเช่ือม stringเขากบั revStr ดว ยการใช method append() เชนเดยี วกบั ตวั อยา งอืน่ ๆ ที่เราไดท าํ มากอ นหนา น้ี เสรจ็จากการเชือ่ มเราก็ใชคาํ สงั่ revStr.reverse() เพอื่ ทําการ reverse ขอมลู ที่อยใู น revStr ที่เหลืออยกู ็คอืการสงผลลพั ธข องการ reverse ไปยงั หนาจอผอู า นอาจสงสยั วาทาํ ไมเราไมส รา ง object ดว ยการสง string ไปใหกับ revStr ในตอนแรกทเ่ี ราสรางrevStr เชนStringBuffer revStr = new StringBuffer(string)เราทําไมไ ดเพราะ Java ไดสรา ง method ในการสราง object จาก class StringBuffer ไวเพียงสามตัวคือ1. StringBuffer() โดยไมใสเ งอื่ นไขใด ๆ2. StringBuffer(int len) ตอ งใสข นาดของ buffer3. StringBuffer(String str) ตอ งใส object จาก class String เทา น้นัยังมี method อีกมากมายทเี่ ราสามารถนาํ มาใชในงานท่เี ก่ียวขอ งกับ string แตเ ราคงไมส ามารถพดู ในทนี่ ้ีไดห มด จงึ เพยี งแตหวงั วาผูอ า นจะทาํ การคน ควา ตอ ไปเพอ่ื ความเขาใจในเรอื่ งทเี่ กีย่ วของกบั stringตอไป ตารางท่ี 4.2 แสดงถึง method ตาง ๆ ของ class StringBufferตาราง 4.2 method ของ class StringBuffermethod ความหมายcapacity() ความจุของ StringBuffer ตวั น้ีlength() ความยาวของ StringBuffer ตัวนี้setLength(new length) กําหนดความยาวของ StringBuffer ดวยความยาวใหมappend(value) เช่ือมคาเขาทางดานหลังของ StringBuffer ตวั น้ีinsert(index, value) เพิ่มคา เขาสู StringBuffer ณ ตําแหนง ทีก่ าํ หนดreplace(start index, end index, String) เปลีย่ นคา ตามจดุ ทีก่ ําหนด ดว ย Stringdelete(start index, end index) ลบคา ออกตามจดุ ท่ีกําหนดdeleteCharAt(index) ลบตวั อกั ษรตามจุดท่ีกําหนดsetCharAt(index, character) เปล่ยี นตวั อกั ษร ณ ตําแหนงทกี่ าํ หนดcharAt(index) คา ตัวอักษร ณ ตาํ แหนงทก่ี ําหนดsubstring(index) คา substring ตามจดุ เริ่มตนท่ีกําหนดจนจบ Stringsubstring(start index, end index) คา substring ตามจดุ ทีก่ าํ หนดเทานนั้toString() object ทม่ี คี าของ String ท่ีอยใู น StringBufferreverse() สลบั ตวั อกั ษรทกุ ตวั ใน StringBufferการกาํ หนดใหขอ มูลของ array เปน string (Array of Strings)เนือ่ งจากวา string เปน object ดงั นัน้ เราจึงสามารถทจ่ี ะเกบ็ string ไวใ น array ได การจดั เกบ็ stringไวใ น array กไ็ มยุง ยาก กค็ ลา ย ๆ กับท่ีเราเก็บขอมูลชนดิ อืน่ ไวใน array น่นั เอง มาถึงตอนนถ้ี าเราลองมองยอนกลบั ไปดกู ารประกาศ method main() ของเรา เราจะเหน็ การประกาศแบบน้ีpublic static void main(String[] args) { …ภายในเคร่อื งหมาย () เราจะเห็นการประกาศ String [] args ซึ่งเปน การประกาศใหต วั แปร args เปน ตัวแปรท่ีใชเก็บ array of strings ซ่งึ การประกาศนก้ี ็เหมอื นกับการประกาศ array โดยทวั่ ไปเพยี งแตเราเปล่ียนใหการจดั เก็บขอ มลู มาเปน string เทาน้ันเอง ลองมาดูโปรแกรมตัวอยางการสราง array ofstrings กนั ดู//ArrayOfStrings.javaimport java.io.*; ภาควิชาคอมพิวเตอรธ รุ กิจ วทิ ยาลัยฟารอ ีสเทอรน
บทที่ 4 การใช Array และ String 130เรมิ่ ตนกบั Javaclass ArrayOfStrings { public static void main(String[] args) { //declare array of 5 strings String[] names = new String[5]; //initialize array names[0] = \"Kafe\"; names[1] = \"River Side\"; names[2] = \"Good View\"; names[3] = \"Cottage\"; names[4] = \"Club G\"; String word = names[2].substring(0, 4); System.out.println(\"First word from names[2] is \" + word); for(int i = 0; i < 5; i++) { System.out.println(names[i]); } }}เราไดประกาศให names เปน array of Strings ทส่ี ามารถเก็บขอ มลู ไดสูงสุด 5 ตวั ดวยคาํ สง่ัString[] names = new String[5];หลงั จากน้ันเรากใ็ สขอ มลู ใหกบั ตําแหนง ตาง ๆ ของ array names และเมือ่ ใสค รบแลว เราดึงเอาคําแรกท่ีอยูใ น names[2] มาแสดง เมอ่ื เสร็จแลวเรากแ็ สดงขอ มลู ท้ังหมดไปยังหนาจอ ดว ยการใช for – loopผลลพั ธข องการ run คอืFirst word from names[2] is GoodKafeRiver SideGood ViewCottageClub Gโปรแกรมตัวอยา งทเ่ี ห็นเปนโปรแกรมอยา งงาย ทีเ่ ขียนขนึ้ มาเพ่อื แสดงการใช array of Stringsกระบวนการตาง ๆ ที่สามารถทําไดกบั array โดยท่ัวไปกส็ ามารถทาํ ไดก บั array of Strings ดงั นั้นผอู า นควรยอนกลับไปดเู รอื่ งของ array ทเี่ ราไดพดู ถึง และลองประยุกตใ ชกระบวนการตา ง ๆ กบั array ofStrings ดูเพอ่ื ใหเ กิดความเขาใจมากย่ิงขน้ึสรปุในบทนเ้ี ราไดพดู ถงึ การเก็บขอ มลู ดว ย array การใช String และ StringBuffer รวมไปถึงกระบวนการตางๆ ท่ีเราสามารถทาํ ไดกบั ตวั แปร หรือ object ตา ง ๆ ท่ีเกิดจาก class String และ class StringBufferผูอา นควรทําความเขา ใจกบั method ตาง ๆ ที่เราไดพดู ถึงเพ่อื การนาํ ไปใชอ ยา งมปี ระสทิ ธภิ าพ จุดหลักๆ ทเ่ี ราไดพ ดู ถงึ คอื9 การสราง array ในการเก็บขอ มลู ชนดิ เดียวกนั หลายตัวไวใ นตัวแปรตัวเดยี ว9 การเขาหาขอ มลู แตล ะตัวใน array ดว ยการใช index9 ขนาดของ array สามารถดึงออกมาจากตัวแปรคงท่ี length9 Array สามารถทจี่ ะเก็บขอ มูลทีเ่ ปน array ได9 เราสรา ง object ท่เี ปน string จาก class String พรอมทงั้ กําหนดคา ทีไ่ มส ามารถเปลย่ี นแปลงได9 ขนาดของ string ตอ งดึงออกมาจาก method length()9 String มี method หลาย ๆ ตัวใหเ ราใชใ นการจดั การกับ string9 เราสรา ง string ท่สี ามารถเปลย่ี นแปลงไดจ าก class StringBuffer ภาควิชาคอมพิวเตอรธรุ กิจ วทิ ยาลัยฟารอ สี เทอรน
บทที่ 4 การใช Array และ String 131เรม่ิ ตนกบั Java9 StringBuffer มี method หลายตวั ทเี่ ราเรยี กใชในการจัดการกบั string ตาง ๆ9 ขนาดของ string จาก class StringBuffer หาไดจ าก method length() และความจขุ อง object ทมี่ าจาก StringBufer หาไดด ว ยการเรยี กใช method capacity()แบบฝก หดั1. จงเขียนโปรแกรมทร่ี บั ขอ มลู ทเี ปน int จาก keyboard จํานวน 10 ตัว เกบ็ ไวใ น array พรอ มทงั้ หา คาสูงสดุ คา ตา่ํ สดุ จาํ นวนของขอ มูลท่เี ปนเลขคที่ ้งั หมด และจํานวนของขอมลู ทเ่ี ปนเลขคทู ั้งหมด2. จงเขียนโปรแกรมทใี่ ช Math.random() ในการสรางขอ มลู จาํ นวน 100 ตวั เกบ็ ไวใ น array ใหแสดง ขอมลู ทั้งหมดไปยงั หนา จอโดยใหม จี ํานวนขอ มูลเปน 5 แถว ๆ ละ 20 ตวั3. จงเขยี นโปรแกรมทสี่ รา ง array 2 มติ ิขนาด 3 x 3 จํานวน 2 ตวั ทมี่ ขี อ มูลเปน int ใหใ สขอมูลใน array ดวยการใช Math.random() ทก่ี าํ หนดใหค าของขอมูลทส่ี รา งขึ้นอยรู ะหวา ง 1 – 9 หลังจาก นน้ั ใหนําเอา array 2 ตวั นีม้ าบวกกัน (Matrix addition) เก็บผลลพั ธท งั้ หมดท่ไี ดไ วใ น array ตัวท่ี สาม พรอมทัง้ แสดง array ท้ังสามตวั ไปยังหนา จอ4. จงเขียนโปรแกรมทร่ี ับ object จาก class String จํานวนสามตวั จาก keyboard ใหตรวจสอบวา string ตัวไหนใหญท สี่ ดุ และ string ตวั ไหนเลก็ ที่สดุ แสดงผลลัพธไปยงั หนา จอ5. จงเขยี นโปรแกรมทใี่ ช array เก็บ string จํานวน 10 ตัวท่อี ยใู นรปู แบบของ day/month/year เชน 02/10/00 ใหโ ปรแกรมตรวจสอบขอ มลู ทอ่ี ยูใน string ทุกตัว เสร็จแลว ใหสง ผลลพั ธท ง้ั หมดใน รปู แบบของ 2 October 2000 ไปยังหนาจอ6. จงเขยี นโปรแกรมทใี่ ช array ในการเกบ็ char จํานวน 10 ตวั ใหท าํ การ reverse ขอ มลู ทอ่ี ยใู น array นี้ ผลลัพธท ไ่ี ดใหเ ก็บไวใ น array ตวั เดมิ7. จงเขียนโปรแกรมทใ่ี ช StringBuffer เกบ็ string จาํ นวน 10 ตัว ใหนาํ string ทงั้ หมดไปเกบ็ ไวใ น string ตวั ใหมโดยให string ทม่ี จี าํ นวนของ char นอ ยอยทู างดา นหนา และ string ทมี่ ีจาํ นวนของ char มากอยทู างดา นหลัง (เรยี งจากนอยไปหามาก)8. จงเขียนโปรแกรมทใ่ี ช array ในการเก็บชื่อของลูกคา จาํ นวน 20 ช่ือ ใหท าํ การคนหาช่อื ของลูกคาที่มี ตัวอกั ษรขึ้นตน ตามท่ี user เปน ผูก ําหนดจาก keyboard ใหแสดงช่ือทกุ ตวั ท่มี ีอักษรข้นึ ตน ดังกลา ว ออกทางหนาจอ9. กาํ หนดให array1 และ array2 เปน array ทเี่ กบ็ int จาํ นวนเทากับ 10 ตวั โดยท่ี ขอ มลู ของแตล ะ array ไดถูกจดั เรียงใหอยูใ นรปู ของ มากไปหานอย จงเขียนโปรแกรมทน่ี าํ เอาขอ มลู ของ array ทง้ั สองตวั มารวมกนั โดยทย่ี งั รกั ษาคุณสมบตั ิของการเรียงจากมากไปหานอย เก็บไวใ น array ตวั ใหม แสดงผลลัพธข องทง้ั สาม array ออกทางหนาจอ10. จงเขยี นโปรแกรมทร่ี บั String 1 ตวั ท่ีประกอบไปดว ย ชื่อตน และนามสกุลทถี่ ูกแบงดวยชอ งวา ง (space) เชน Micha Sapporo หลงั จากนั้นใหแบง String ตวั นอี้ อกเปน 2 ตัวใหเ ปน ชอ่ื ตน 1 ตัว และนามสกุล 1 ตวั11. จงปรับปรงุ โปรแกรมในขอ 10 ใหท าํ หนา ที่ลบชองวางทอี่ าจนําหนา และตามหลงั ช่อื ทน่ี าํ เขาจาก keyboard12. จงเขียนโปรแกรมทร่ี บั String 2 ตัวจาก keyboard ใหท าํ การคนหาวา String ตวั ทส่ี องมีอยใู น String ตวั แรกหรอื ไม ถามี มอี ยูก่ตี วั อยทู ่ีตาํ แหนงใดบา ง13. จงเขยี นโปรแกรมทรี่ บั String 2 ตัวจาก keyboard ใหนําเอา String ตวั ทส่ี องไปใสไ วใ นตาํ แหนง ที่ ถูกกําหนดจาก user ถาตาํ แหนง ที่ user กําหนดเปนไปไมไดใ หน าํ String นน้ั ไปใสไ วดา นหลังของ String ตวั แรก14. จงเขยี นโปรแกรมทที่ ําหนาทดี่ งั น้ี ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลยั ฟารอีสเทอรน
บทท่ี 4 การใช Array และ String 132เรมิ่ ตน กบั Javaรับ String ในรปู แบบของ 112 Newell Street, Walla Walla, WA 99210ทําการตดั String ใหอ ยใู นรูปแบบของNo. 112Street: Newell StreetCity: Walla WallaState: WAZip: 9921015. จงเขยี นโปรแกรมทที่ ําการสลบั คําทม่ี อี ยใู น String เชน ถา String เปน I love Chiang Mai ผลลัพธ ทไ่ี ดจากการสลบั จะเปน Mai Chiang love I ภาควิชาคอมพิวเตอรธ รุ กจิ วทิ ยาลัยฟารอสี เทอรน
เราไดเ รยี นรูถงึ โครงสรางหลกั ของการเขียนโปรแกรมโดยทว่ั ไปจากบทกอน ๆ เราไดเ รยี กใช class ตาง ๆ(บาง class) ท่ี Java มีใหใ นการเขยี นโปรแกรม รวมไปถงึ การสรา ง object จาก class String และ classStringBuffer ในบทนี้เราจะมาทาํ ความเขาใจในเรื่องของการสรา ง class การสราง object จาก class ที่เราสรา งขนึ้ การนาํ เอา class มาชวยแกโจทยแ ละปญ หาทางดานคอมพวิ เตอรหลังจากจบบทนีแ้ ลว ผูอา นจะไดรบั ทราบในเร่ืองของ o ความหมายของ class และการสราง class o การสรา ง constructor o การสรา ง method o การ overload method o การสราง object จาก class o การใช attribute ตา ง ๆ ของ class o การสราง nested class o การสรา ง และการเรียกใช packageClass และ การสรา ง classเราไดเ ห็นจากบทกอน ๆ วาเราตองกําหนดโปรแกรมท่ีเราเขียนข้นึ ดว ยคาํ วา class เสมอ แตเ ราไมไ ดพดูถงึ เลยวา class คืออะไร โดยท่วั ไปการเขยี นโปรแกรมดว ยภาษาท่เี รยี กกนั วา Object-OrientedProgramming (OOP) น้ันคําวา class มักจะหมายถึงคุณลกั ษณะ หรอื คณุ สมบัติ (prescription) ของวตั ถุใดวตั ถุหน่งึ (ทเี่ กิดจาก class นั้น ๆ) ซ่ึงถา พดู แบบภาษาชาวบานทั่ว ๆ ไปเราอาจเรยี ก class ดงั กลาววาเปน แมแ บบของ class (อื่น ๆ ท่ีตามมาก็ได) หรอื วาเปนตวั กาํ หนดคณุ สมบตั ิของ object ท่ีไดถูกสรา งขึน้ถา เรามองไปรอบ ๆ ตัวเรา เราจะเห็นวตั ถหุ ลากหลายชนดิ เชน เกา อี้ keyboard ถว ยกาแฟ และอะไรอืน่ๆ อกี มากมาย ซ่งึ วตั ถหุ ลายชน้ิ มีรปู รา งหนาตาเหมือนกัน มีการใชส อยทคี่ ลา ย หรอื เหมือนกนั เชน เกา อ้ีมีส่ีขา หรือสามขา มพี นกั พิง หรอื ไมม พี นักพงิ แตการใชงานเหมือนกันคือ เอาไวนัง่ หรืออีกตัวอยางหนึง่เชน รถยนต มสี ล่ี อ ขับเคลอ่ื นไปไดทั้งขา งหนา และขา งหลงั ตอ งใชน าํ้ มนั เปนเชอื้ เพลิง มสี ีภายนอกท่ีตา งกัน แตมคี ณุ สมบัตทิ ่เี หมอื นกันคือเอาไวเดินทางไปยังที่ตาง ๆ และโดยทั่วไปแลว ผขู บั ขสี่ วนใหญจ ะไมรถู ึงการทาํ งานของเครื่องยนตทีอ่ ยภู ายใน รแู ตเพียงขอมลู ที่จาํ เปนบางสว น เชนเปดประตูอยางไรstart เครอื่ งยังไง เขาเกียรอยางไร อยา งนเี้ ปน ตน การเขียนโปรแกรมในรูปแบบของ OOP กเ็ หมอื นกัน ถาเราพฒั นาโปรแกรมใดสักโปรแกรมหนงึ่ ใหผ อู นื่ ใช ผใู ชก ลมุ นน้ั ไมจ าํ เปนทจ่ี ะตองรวู าเราเขยี นอยางไร ควรรเู พียงแตว าจะใชส วนตา ง ๆ ที่เราเขียนขนึ้ อยา งไร และนาํ กลบั ไปใชใหมไ ดอ ยางไร (เหมอื นเชน ทเี่ ราเรียกใช method ตา ง ๆ จาก class String เราไมรวู าเขาเขียน code อยางไร รูแตวา ใชงานอยา งไร)ถามองกลับไปดู class String ที่เราใชในบทท่ีส่นี นั้ จะเห็นวา เราสามารถทจี่ ะใช method ตาง ๆ ทีม่ โี ดยไมมีการจาํ กัดจาํ นวนครง้ั ท่ใี ช โปรแกรมตัวไหนเรยี กใชก ็ได การทํางานก็ยังคงเหมอื นเดมิ ผลลพั ธของการเรยี กใชกเ็ หมอื นเดิม object ที่มาจาก class String ไมวา จะเปนตัวไหน เรากส็ ามารถทจ่ี ะใช methodตา ง ๆ กับ object เหลา นไี้ ด ในการออกแบบ class นน้ั โดยท่ัวไปเราตอ งออกแบบใหเ หมาะสมกับงานของเรา เชนถา โปรแกรมของเราตองวุนวายกบั คนเรากอ็ าจออกแบบให class ของเรามีคณุ สมบตั แิ ละคณุ ลกั ษณะ ทเี่ กย่ี วของกบั คน เชน มีช่ือ นามสกุล ท่ีอยู สถานะภาพ อาชพี และอะไรอนื่ ๆ ทาํ นองนี้โดยทวั่ ไปการออกแบบ class น้นั มีสวนประกอบทจี่ าํ เปน และ สาํ คัญอยสู องสวน คือ
บทท่ี 5 Objects และ Classes 134เริม่ ตนกบั Javao Field หมายถงึ ตัวแปรสาํ หรับการเก็บขอ มูลของ object ทีบ่ งบอกถงึ ความเหมือน หรือ ความแตกตา ง กันของ object ท่เี กดิ มาจาก class เดียวกัน หนังสือหลายเลม เรียก field ทว่ี าน้ีวา Data member หรอื สมาชกิ ของ class ท่เี ปน ที่เกบ็ ขอมูล หรอื ทเี่ ราเรยี กกันจนคนุ ปากวา variable (identifier)o Method หมายถึงกระบวนการ (operation) ตา ง ๆ ท่เี ราสามารถทาํ ไดก บั object นนั้ ๆ ของ class ซึ่งกระบวนการตา ง ๆ ทที่ ําไดส วนใหญจะกระทาํ กบั data memberField หรือ Data member สามารถที่จะกาํ หนดใหเ ปนขอมลู ไดท กุ ชนิด รวมไปถงึ การเปน ตวั อางองิ(reference) ถงึ object ท่มี าจาก class อ่ืน (เชน ตัวแปรทม่ี ชี นดิ เปน String หรอื array ท่ีเราไดพ ดู ถงึกอนหนา น้)ี หรอื แมแ ตกระท่ังการเปน ตัวอางองิ ถงึ class ของมนั เองMethod จะประกอบไปดว ยช่อื ของ method และชดุ คาํ ส่ังตา ง ๆ ท่ีตัวมันเองมหี นา ทใี่ นการทาํ ตามคุณลกั ษณะท่ีไดถกู ออกแบบไว ซงึ่ โดยสว นใหญจะกระทาํ กบั data member (แตกไ็ มจ าํ เปนเสมอไปเชน ในกรณขี อง method main())เพอ่ื ใหเ ห็นภาพชดั เจนยง่ิ ข้นึ เรามาลองออกแบบ class ขนึ้ มาสัก class หน่งึ ทเ่ี กย่ี วของกับ StudentData member class name Instance variableMethod Class variable class Student { String id; Constructor String firstname; Parameter list String lastName; String dateOfBirth; static int count = 0; Student(String iden, String fName, … … } public int getCount() { return count; } //method ตัวอ่นื ๆ ทเ่ี หลืออยู … … }ภาพท่ี 5.1 ตัวอยา งการสราง class StudentClass Student ทเี่ ราสรา งข้ึนประกอบไปดว ยสวนประกอบสองสวนดงั ทไ่ี ดกลาวไปแลว คือ สว นที่เปนdata member และสวนทเ่ี ปน method ซึง่ ภายในสว นสองสว นน้ี ยงั มีสว นประกอบอน่ื อกี ทมี่ ีความสําคญัตอ การออกแบบ และการใช class กอนอื่นเรามาดสู ว นประกอบของ data member กนัตัวแปรทีเ่ ปน สมาชิกของ class (Class variable และ Instance variable)Object ท่ีเกดิ มาจาก class นนั้ เราเรียกกนั วา instance ของ class และ object นี้จะมสี วนประกอบที่ classมใี ห คือ ตวั แปรตาง ๆ ทีอ่ ยูใน class ตัวแปรเหลา น้จี ะมขี อ แตกตางกัน คอื อาจเปนตวั แปรท่เี ปน classvariable และอาจเปน ตวั แปรทเี่ ปน instance variableหลงั จากทเ่ี ราสราง object แลว object จะไดร บั copy ของตัวแปรท่ี class มใี ห ซง่ึ ตัวแปรเหลา นีจ้ ะเปนตวั บง บอกวา object ตัวไหนแตกตางกนั อยางไร คาของตัวแปรของ object แตล ะตวั จะมคี า เหมือนหรอื ภาควิชาคอมพิวเตอรธรุ กิจ วทิ ยาลยั ฟารอ ีสเทอรน
บทที่ 5 Objects และ Classes 135เริ่มตนกบั Javaแตกตางกนั น้นั ขึน้ อยูกับการกาํ หนดของโปรแกรมเอง เชน ถาเราสรา ง object สองตวั จาก class Studentข้นึ มาใชงาน object สองตวั นจ้ี ะมี copy ของตัวแปรทั้งสต่ี วั ของมันเอง เราเรยี กตัวแปรเหลา น้วี าinstance variableสว นตวั แปรอกี ชนิดหนึง่ คือ class variable น้ันกําหนดไววา object ทุกตวั ทเี่ กดิ จาก class จะใชต ัวแปรชนดิ นรี้ ว มกนั และตวั แปรนสี้ ามารถทจ่ี ะกําหนดและสรางขึน้ มาใชไ ด ถงึ แมว า จะไมม ี object เกดิ ข้นึ จากclass นี้ก็ตาม เพราะวาตวั แปรนี้เปนของ class ดงั น้นั ทั้ง class และ object ก็สามารถทจ่ี ะใชมนั ได ถาคาของตัวแปรน้เี ปลี่ยนไป object หรือ class ทีอ่ า งการใชถ ึงตวั แปรตวั นีก้ จ็ ะไดค า ใหมทีเ่ ปลย่ี นไป ซ่ึงตรงกันขามกับตวั แปรที่เปน instance variable ถา หาก object ตวั ไหนเปล่ยี นคา ของตัวแปรใด ๆ (copy) คา ที่เปล่ยี นไปจะไมม ีผลตอตัวแปรใด ๆ ใน object ตวั อนื่ การประกาศใหต ัวแปรใด ๆ ก็ตามเปน classvariable น้ันเราตองใชค าํ สงั่ static นําหนาตวั แปรนนั้ เสมอ ดงั ท่ไี ดแ สดงในภาพท่ี 5.2class Student { Object ทุกตวั share static int count = 0; ตวั แปร count 0 String id; String firstname; Joe String lastName; id String dateOfBirth; firstNAme lastName dateOfBirth ทงั้ Joe และ Jon มี copy ของตวั แปรเหลาน้ี Jon id firstNAme lastName dateOfBirthภาพท่ี 5.2 การใชตวั แปรแบบ class variable และแบบ instance variableตัวแปรท้งั สองชนิดมกี ารใชท แี่ ตกตา งกัน และตางก็มคี วามสาํ คญั ทง้ั คู โดยทั่วไปการใช class variableนน้ั นยิ มใชใ นกรณีทเี่ ราตองการที่จะเกบ็ คา ท่เี ปนคาที่ object ทง้ั หมดตอ งใชร วมกัน เชน คา คงทต่ี าง ๆ ทม่ี ีความจาํ เปนใน class นนั้ ๆ ตวั อยา งของเราใช count เปนตวั แปรทใี่ ชร วมกนั ระหวา ง object ตาง ๆสว นตวั แปรท่ีเปน instance variable นั้นมคี วามจําเปนอยา งมากในการออกแบบ class ตา ง ๆ ทั้งนเ้ี พราะตัวแปรชนดิ นีจ้ ะเปนผกู าํ หนดความแตกตางระหวาง object ตา ง ๆ ทีไ่ ดถ ูกสรา งขน้ึ จาก class น้ัน ๆ เชนobject จาก class Student ที่ถกู สรา งขนึ้ อาจมี id ทไ่ี มเหมือนกนั ชอ่ื ตน และ ชือ่ สกุลทแี่ ตกตางกัน วนัเดอื นปเกิดท่ไี มเ หมือนกนั อยางนี้เปนตนขอ แตกตา งระหวา ง class กบั objectclass object เปน แมแบบทมี่ สี มาชกิ ทงั้ data และ ตองเกิดมาจาก class ใด class หนึ่ง มตี วั ตนขณะโปรแกรมกําลงั execute method สามารถเปลยี่ นแปลงคา ของ data ขณะ ไมมตี วั ตนขณะทโี่ ปรแกรมกาํ ลัง execute ไมม กี ารเปลีย่ นแปลงขณะโปรแกรม execute execute ภาควิชาคอมพิวเตอรธ รุ กิจ วทิ ยาลัยฟารอสี เทอรน
บทท่ี 5 Objects และ Classes 136เริม่ ตน กบั JavaMethodจากแผนภาพที่ 5.1 เราจะเห็นวามี method อยูใน class Student ของเรา (บางสวน) method เปนกระบวนการ (ทรี่ วบรวมชดุ คําสงั่ ) ที่เราสามารถเรียกใชใ หทํางานตาง ๆ ใหเรา ซึ่งอาจเปน การทํางานท่ีเกยี่ วของกับ ตัวแปรทอี่ ยใู น class หรอื กระบวนการอ่ืน ๆ ทจี่ าํ เปน ของ class นน้ั ๆ และเชน เดียวกันกบั ตวัแปรทไี่ ดก ลา วไวกอ นหนาน้ี method กไ็ ดถ กู แบง ออกเปน สองชนิด คือ class method และ instancemethodClass method กค็ อื method ท่ีสามารถท่ีจะไดร ับการประมวลผลถึงแมว า จะไมมี object อยเู ลย ถา เรามองยอนกลับไปดู method main() ของเรา เราจะเห็นวาไมม ี object ใด ๆ เกิดจาก class ท่ีมี methodmain() อยูเลย และการประกาศใช class method กเ็ ชน เดยี วกนั กับ class variable เราตอ งใชค าํ สั่งstatic นาํ หนาเสมอสวน instance method น้นั เปน method ทต่ี อ งมกี ารใชร ว มกันกับ instance variable ทงั้ นเ้ี พราะวาmethod ประเภทน้ถี กู สรา งขึน้ มาจาก class เดียวกนั กบั ที่ object ถูกสรา งขนึ้ มา การกระทาํ ใด ๆ กต็ ามตองทําผา น instance method เทา นนั้การเขา หาตวั แปร และ method ของ classในการท่ีจะเขาหาตวั แปรหรอื method ของ class นั้นไมว าจะเพ่ืออะไรก็ตามแต เราจะตองเขา หาผา นทางobject ของ class ตามดวย . (dot) และตามดว ยชอื่ ของตวั แปร หรือ ชอื่ ของ method เชนstudentA.firstName;หรือstudentB.getAge();ในตอนน้เี ราจะดูเพียงแคว ธิ กี ารเขา หา แตต อ ไปเราจะดูเรอ่ื งการกําหนดนโยบายของการเขาหาตวั แปรหรือ method เหลา น้ี ถา มี method หรือ ตัวแปรอยเู รากเ็ ขา หาแบบท่ีไดก ลา วมาแลว Java จะฟอ งดว ยerror ถาหากอา งถงึ ตัวแปรหรอื method ท่ไี มไดถกู สรา งขนึ้ เพื่อใหเห็นภาพของการสรา ง class รวมไปถึงสวนประกอบตาง ๆ ของ class เรามาดู class Student ทไี่ ดถูกสรา งขึ้นเพอื่ เปนตัวอยา ง//Student.java - Simple class for studentimport java.lang.Integer;import java.util.Calendar;class Student { String id; //student id String firstName; //student's first name String lastName; //student's last name String dateOfBirth; //student's date of birth in //the form: dd/mm/yyyy static int count = 0; //number of object created //class constructor to initialize fields to given values Student(String iden, String fName, String lName, String dOfB) { id = iden; firstName = fName; lastName = lName; dateOfBirth = dOfB; count++; } //method to return count public int getCount() { ภาควิชาคอมพิวเตอรธ ุรกิจ วทิ ยาลัยฟารอ สี เทอรน
บทท่ี 5 Objects และ Classes 137เริม่ ตน กับ Java return count; } //method to return student's id public String getId() { return id; } //method to returnstudent's first name public String getFirstName() { return firstName; } //method to return student's last name public String getLastName() { return lastName; } //method to return student's date of birth public String getDateOfBirth() { return dateOfBirth; } //method to calculate student's age from //year of birth public int getAge() { //retrieve a year String year = dateOfBirth.substring(6); //convert it to an int int birthYear = Integer.parseInt(year); //get current year from system's calendar Calendar now = Calendar.getInstance(); int thisYear = now.get(Calendar.YEAR); //return the difference return thisYear - birthYear; } //method to display students' info to screen public void display() { System.out.print(getId() + \" \"); System.out.print(getFirstName() + \" \"); System.out.print(getLastName() + \" \"); System.out.println(\"Age: \" + getAge()); }}เราไดกาํ หนดให class Student มี field อยูท ้งั หมด 5 field คอื id, firstName, lastname, dateOfBirth,และ count โดยทส่ี ี่ตวั แรกเปน instance variable ท่ีเอาไวเ กบ็ ขอ มูลโดยเฉพาะของ object แตละตวั ที่ไดถูกสรา งข้ึน และตวั สดุ ทา ยเปน class variable ท่เี อาไวเ กบ็ จํานวนของ object ทไี่ ดถ กู สรางขึ้นเรายังไดส ราง method อีก 7 ตวั ซ่ึงมหี นาทใ่ี นการทาํ งานทต่ี า งกนั โดยเฉพาะ method ทมี่ ีชอ่ื เหมอื นกนักบั class น่ันก็คือ method StudentStudent(String iden, String fName, String lName, String dOfB) { id = iden; firstName = fName; lastName = lName; ภาควิชาคอมพิวเตอรธ ุรกิจ วิทยาลยั ฟารอ ีสเทอรน
บทที่ 5 Objects และ Classes 138เริม่ ตน กับ Java dateOfBirth = dOfB; count++;}Student() เปน method พิเศษทีม่ ีชือ่ เรยี กกนั โดยทัว่ ไปวา เปน constructor ของ class ซง่ึ constructorนี้สว นใหญจ ะทาํ หนาทใ่ี นการกาํ หนดคา เบอ้ื งตนใหก บั object ที่ไดถ กู สรา งขึน้ จาก class เชน กาํ หนดคาใหก ับ field ทุก field หรือบาง field (ท้งั นีต้ องแลว แตก ารออกแบบการทาํ งานของ constructor นั้น ๆ)ตวั อยา งของเรากาํ หนดให constructor ทาํ การกาํ หนดคา ใหก ับ field ทกุ field (ยกเวน class variable ท่ีชือ่ count) ใหม ีคา เปนไปตามคา ทไ่ี ดรบั เขามาจากตัวแปรทอี่ ยใู น parameter list แต constructor จะมีคุณสมบตั ิพเิ ศษคือ การกําหนดคาน้ันจะไดร ับการกระทําโดยอตั โนมตั ิ เราไมต องเรยี กใช constructorการเรยี กใช constructor นี้ Java จะเปน ผเู รียกใหในตอนทเ่ี ราสรา ง object ขึ้นมา กอนท่ีเราจะพดู ถงึconstructor และการถูกเรียกใชง านโดยอตั โนมัตนิ ัน้ เรามาดกู ันถงึ method และ วธิ ีการสรา ง methodรวมไปถึงการสง คาใหก บั method และการสง คากลับของ methodการสรา ง methodในการสราง method นน้ั เราจะตองกําหนดชอื่ ใหกบั method กําหนด parameter (ถามี) กาํ หนดการสงคา กลับของ method (ถามี) โดยทั่วไป method ไดถูกแบง ออกเปนสองแบบ คือ o Method ทสี่ งคา กลับใหแ กผ ทู เี่ รยี กใช method o Method ที่ไมมกี ารสง คา ใด ๆ กลบั ไปใหผ ูเรยี กโครงสรา งของ method โดยทว่ั ไปจะมีรปู แบบดงั น้ีชนดิ ของคาทีส่ งกลับ ชนดิ ของคาที่สงกลบั ช่อื ของ method Parameter (ถา มี)เปน ชนดิ ไหนก็ไดใชค ําส่ัง void ถาไมม ีคาทตี่ อ งสงกลับ returnType methodName( arg1, arg2, …, argn ) { // body of method … … } ชดุ คําส่ังตาง ๆ ที่ method ตวั นี้มีอยู (body of method)ภาพท่ี 5.3 การสราง methodเราลองหยิบเอา method getAge() จาก class Student มาดกู นั เพื่อใหเ กดิ ความเขา ใจในเร่ืองสว นประกอบตาง ๆ ทม่ี ีอยูใน method ท่ีวา น้ีpublic int getAge() { String year = dateOfBirth.substring(6); int birthYear = Integer.parseInt(year); ภาควิชาคอมพิวเตอรธ รุ กจิ วิทยาลัยฟารอ ีสเทอรน
บทท่ี 5 Objects และ Classes 139เริ่มตนกบั Java Calendar now = Calendar.getInstance(); int thisYear = now.get(Calendar.YEAR); return thisYear - birthYear;}ถา เราแยกสว นประกอบตาง ๆ ออก เราก็จะไดขอ มูลดังนี้ชนดิ ของคา ทส่ี ง กลับ intช่อื ของ method คือ getAgeParameter ไมม ีชุดคาํ สั่งคอื String year = dateOfBirth.substring(6); int birthYear = Integer.parseInt(year); Calendar now = Calendar.getInstance(); int thisYear = now.get(Calendar.YEAR); return thisYear - birthYear;ถา สงั เกตใหด จี ะเห็นวา ดานหนา สุดของ method getAge() จะมีคําวา public อยู คําวา public น้จี ะเปนตัวกาํ หนดนโยบายการเขาหา method ซง่ึ เราจะไดพดู ถงึ ในตอนตอไป แตต อนนเี้ ราจะดเู ฉพาะสว นประกอบโดยท่ัวไปที่ method ตอ งมีสวนประกอบทสี่ าํ คญั อกี สว นหน่ึงก็คอื คาํ วา return ในบรรทดั สดุ ทา ย เน่อื งจากวา method getAge()ของเราตองสงคากลบั ดังน้ันเราจงึ จําเปน ทีจ่ ะตองบอกให Java รูวาเรามคี า ที่ตอ งการสงกลับ ดงั ทไ่ี ดประกาศไว ถา หากวาเราไมม กี ารใช return พรอ มท้งั คา ทต่ี อ งการสง กลับ Java ก็จะฟองดวย error ตอนทเ่ี รา compile โปรแกรมเรามาลองดู method ทีไ่ มม กี ารสง คา กลบั ใน class Student ของเรา ซงึ่ มอี ยเู พยี งตัวเดยี ว คือpublic void display() { System.out.print(getId() + \" \"); System.out.print(getFirstName() + \" \"); System.out.print(getLastName() + \" \"); System.out.println(\"Age: \" + getAge());}ชนิดของคาทสี่ ง กลบั ไมม ีชอ่ื ของ method คือ displayParameter ไมมีชุดคาํ สง่ั คือ System.out.print(getId() + \" \"); System.out.print(getFirstName() + \" \"); System.out.print(getLastName() + \" \"); System.out.println(\"Age: \" + getAge());Method display() ทาํ หนาทเ่ี ปน เพียงตวั แสดงขอมูลของ object ทเี่ กิดจาก class Student ออกทางหนา จอ โดยการเรียกใช method อ่ืน ๆ ท่ีมอี ยูใน class Student การท่จี ะให method ไมต องสง คา กลบันนั้ เราตอ งใช คําวา void นาํ หนาชื่อ method เสมอ และ method ทม่ี คี ําวา void นาํ หนา ตองไมม คี าํ วาreturn ใด ๆ ทมี่ ีคาในการสง กลบั ยกเวนคําวา return ที่ตามดวย ; (semicolon) เทานนั้ เชน ถาเราใชvoid เรากส็ ามารถท่จี ะใช return ตามดว ย ; หรือไมใ ชเลย อยางใด อยา งหน่ึง เพราะฉะนน้ั methoddisplay() ท่เี หน็ ก็สามารถท่จี ะเขยี นไดอีกแบบหนงึ่ ดงั น้ีpublic void display() { System.out.print(getId() + \" \"); System.out.print(getFirstName() + \" \"); System.out.print(getLastName() + \" \"); System.out.println(\"Age: \" + getAge()); ภาควิชาคอมพิวเตอรธ ุรกิจ วทิ ยาลัยฟารอ สี เทอรน
บทท่ี 5 Objects และ Classes 140เริ่มตน กับ Java return ;}ขอ แตกตางระหวาง method ท่ีสงคา และ method ทไี่ มส งคาmethod ทสี่ งคา method ทไ่ี มส ง คา มคี าํ วา return และ คา ทตี่ องสง กลบั ไมจ ําเปน ตองมคี าํ วา return แตถ ามจี ะตอ ง ขึ้นตน method ดว ยชนิดของขอมูลทต่ี อง ตามดว ย ; อยางเดยี วเทา นัน้ สงกลับ ขึน้ ตน method ดว ยคาํ วา void เสมอกระบวนการทเ่ี กดิ ขน้ึ เมอื่ มกี ารใช parameter listเราลองมาดโู ปรแกรมตวั อยางทีม่ กี ารสรา ง method ท่มี ีการใช parameter list กอ นที่เราจะกลับมาดูclass Student อกี ครง้ั หน่งึ//Parameters.javaclass Parameters { public static void main(String[] args) { double radius = 2.0;double area = findArea(radius); System.out.println(\"Area of a circle is : \" + area);} public static double findArea(double r) { return Math.PI * r * r; }}โปรแกรม Parameters.java สรา ง method ทเี่ ราเรียกวา class method ขึน้ มาใชง านหนึง่ ตวั (การประกาศให method เปน class method กเ็ หมอื นกบั การประกาศใหต วั แปรเปน class variable เราตอ งใชคาํ วา static นําหนา ) ซงึ่ method นี้มหี นาทีใ่ นการคาํ นวณหาพ้นื ที่ของวงกลมทีม่ รี ัศมที ่ีกาํ หนดไวในตวั โปรแกรม (ในทีน่ คี้ อื 2) method findArea() มี Parameter หน่งึ ตัวท่มี ชี นดิ เปน double และจะสงคาของพื้นทที่ ค่ี ํานวณไดกลับไปใหผ เู รียก ซง่ึ ในทน่ี ีค้ อื class Parameters การเรยี ก method findArea(()น้นั เราเรียกดว ยประโยคdouble area = findArea(radius);ซึ่งเมอ่ื Java เหน็ การเรียกเชน นี้ Java ก็จะไป execute method findArea() ดวย parameter ทม่ี ีชนดิเปน double และสงคา 2.0 ไปให หลังจากที่คํานวณคาพนื้ ท่ีไดแลวกจ็ ะสง กลบั ออกมา และนาํ ไปเก็บไวในตวั แปรช่อื area ภาพที่ 5.4 แสดงการสง คา ผานทาง parameter list ภาควิชาคอมพิวเตอรธ ุรกิจ วทิ ยาลยั ฟารอ สี เทอรน
บทที่ 5 Objects และ Classes 141เรมิ่ ตนกับ Javaclass Parameters { คาของ radius จะถกู สง public static void main(String[] args) { เขา มาไวในตัวแปร r double radius = 2.0; double area = findArea(radius); … …} … …ชนิดของคาท่ีสงกลับ public static double findArea(double r) {ออกมา ตองเปน ชนดิ return Math.PI * r * r;เดียวกัน } คา ทไ่ี ดจากการคาํ นวณจะถูก สงไปให ตวั แปร areaภาพที่ 5.4 การสง parameter ใหกบั method และการสงคา กลับออกจาก methodการสง คาผา นทางตวั แปรทอ่ี ยใู น parameter list นัน้ มีอยสู องแบบคือ 1) การสง ทเ่ี รยี กวา pass-by-valueหรอื การสง เฉพาะคาเขาไปใน method นัน้ ๆ และ 2) การสงแบบท่เี รยี กวา pass-by-reference ในการสงคา ทีเ่ ปน primitive type นน้ั Java จะกาํ หนดใหการสง เปนแบบ pass-by-value เทา นั้น ซง่ึ ไดแสดงไวในภาพที่ 5.5class PassByValue { total public static void main(String[] args) { 10 int total = 10; copy ของ total … 10 … int newTotal = increment(total); … } … การประมวลผลทาํ public static int increment(int sum) { กับ copy ของ sum += 10; total return sum; } ตวั แปร sum อา ง ถึง copy ของ total ทอี่ ยใู น main()ภาพท่ี 5.5 การสง คาแบบ pass-by-valueตวั แปร total ทอี่ ยใู น method main() นั้นจะไมไดร บั ผลกระทบจากการเปลยี่ นคา ท่เี กิดข้ึนภายในmethod increment() ทัง้ นีก้ ็เพราะวา กระบวนการท่ีเกดิ ข้ึนไมไดก ระทํากับตัวแปร total แตเปนการกระทาํ กับ copy ของ total ภาควิชาคอมพิวเตอรธรุ กจิ วิทยาลยั ฟารอสี เทอรน
บทท่ี 5 Objects และ Classes 142เริ่มตนกบั Javaการสง คาไปยงั method แบบ pass-by-value น้คี าทีส่ ง เขาไปจะถกู นําไปใชภายในตวั method เทา นนั้การเปลีย่ นแปลงใด ๆ ท่เี กดิ ขน้ึ จะไมม ีผลกระทบกบั ตัวแปรทเี่ ปนเจาของคานั้น ภายนอก method เลย ซึง่ตรงกนั ขามกับ การสงคา ในแบบท่เี รยี กวา pass-by-reference ลองมาดตู วั อยา งโปรแกรมการสงคา แบบpass-by-value กนั//PassByValue.javaclass PassByValue { public static void main(String[] args) { int total = 10; System.out.println(\"Before calling: total is \" + total); System.out.println(\"Value returns from increment() is \" + increment(total)); System.out.println(\"After calling: total is \" + total); } public static int increment(int sum) { sum += 10; return sum; }}ผลลัพธท ่ีไดจ ากการ run คือBefore calling: total is 10Value returns from increment() is 20After calling: total is 10increment() ถกู เรียกภายใน main() จากประโยค System.out.println(\"Value returns fromincrement() is \" + increment(total)); ซง่ึ มีการสง คาของ total ไปให (ซ่งึ มคี าเปน 10) คานถี้ กูนาํ ไปใชใน increment() ผานทางตวั แปรทชี่ อ่ื วา sum ภายใน increment() ตวั แปร sum ถกู เปลยี่ นคาดว ยการนําเอา 10 ไปบวกเพิ่ม ทําให sum มีคา เปน 20 ซงึ่ คานีจ้ ะถูกสง กลับไปยัง main() ทําใหการแสดงผลทางหนาจอมีคา เปน 20 แตห ลงั จากนัน้ เรากําหนดใหมีการแสดงคาของ total อีกคร้งั หนงึ่ ซงึ่ผลลพั ธท ไ่ี ดค อื คาของ total ยงั คงเปน 10 อยู จะเห็นวา คา ของ total ทไ่ี ดร ับการเปล่ียนแปลงภายในincrement() (ผานทางตวั แปร sum) ไมม ีผลตอ ตัวแปร total อยางใดเลย การเปลีย่ นแปลงเกดิ และตายภายใน increment() เทา น้นั เรามาลองดูโปรแกรมตวั อยางอกี โปรแกรมหนึง่//PassByValue2.javaclass PassByValue2 { public static void main(String[] args) { String myString = \"Business Computers\"; System.out.println(\"Before string is: \" + myString); changeString(myString); //calling changeString() System.out.println(\"After myString is: \" + myString); } public static void changeString(String string) { System.out.print(\"\tInside changeString(), \"); System.out.println(\"myString is: \" + string); string = \"at Far Eastern College\"; ภาควิชาคอมพิวเตอรธ รุ กจิ วทิ ยาลัยฟารอ ีสเทอรน
บทท่ี 5 Objects และ Classes 143เรม่ิ ตน กบั Java }}โปรแกรม PassByValue2.java สรา ง string หนง่ึ ตวั มขี อความวา \"Business Computers\" และสง stringนี้ไปให method changeString() ซ่ึงทาํ หนาทใี่ นการเปลีย่ นคา ของ string ทส่ี งเขา มาใหเ ปน \"at FarEastern College\" แตหลังจากท่ีเรา run โปรแกรมดู เรากไ็ ดผ ลลัพธตามทเี่ ห็นดานลา งนี้Before string is: Business Computers Inside changeString(), myString is: Business ComputersAfter myString is: Business Computersจะเหน็ วา การเปลี่ยนแปลงคา ของ string ทส่ี งผา นเขา มานั้นจะเปน เพียงการเปลี่ยนแปลงแบบช่ัวคราวเทานน้ั การเปล่ียนแปลงเกิดข้ึนภายใน changeString() และไมมีผลกระทบใด ๆ กับคา ของตัวแปรmyString แตอยางใดเลยการสงคา แบบอา งอิง pass-by-referenceการสง คาแบบ pass-by-reference นัน้ ส่งิ ทเ่ี ราสง เขา ไปใน method น้ันไมใ ชคา ของตวั แปร แตเ ปนตวั อา งอิงถงึ ตวั แปร หรอื object นนั้ ๆ โดยตรง เราอาจพดู ไดว าสิง่ ท่ีเราสง ไปนั้นเปนที่อยู หรอื addressของตวั แปร หรอื object นั้น ๆ กไ็ ด เรามาลองดูตัวอยา งการสงแบบ pass-by-reference กันในภาพที่5.6public static void main(String[] args) {Circle red = new Circle(5.0); … … … ท้ัง red และ Circle objectred.change(red, 2.0); copy ของ red Radius: 5.0 ตางกอ็ างถึง … copy of red reference สราง copy object เดิม ของ red red reference copy made ประโยค c อา งถึง c.changeRadius(radius) copy ของ ทาํ การเปลย่ี นแปลงขอมลู ของ object เดิมผานทาง red copy ของ red public Circle change(Circle c, double radius) { c.changeRadius(radius); return c; }ภาพท่ี 5.6 การสงแบบ pass-by-referenceตัวอยา งการสงแบบ pass-by-reference ทเี่ หน็ ในภาพที่ 5.6 นน้ั เราสรา ง object จาก class Circle หนง่ึตัว โดยใหมชี ่อื วา red และมี radius เทา กับ 5.0 เราเรยี ก method change() ผานทาง object red ดวยการสง object red และคา ใหมของ radius ไปให เม่ือ method change() ถูกเรยี กดว ย parameterดังกลา ว Java จะทาํ การสราง copy ใหก ับ red และจดั เก็บ copy น้ีไวที่ c เนือ่ งจากวา ท้งั red และ c ตา งกอ็ า งถงึ object ตวั เดียวกัน ดงั นน้ั การเปลยี่ นแปลงใด ๆ ทเ่ี กดิ ขึ้นยอ มมผี ลกระทบตอ object ตัวเดิมทท่ี งั้red และ copy ของ red อางถึง (หรอื เปน ตัวแทนอย)ูเราไดส ราง method changeRadius() ขึ้นมาเพอ่ื ใชในการเปลี่ยนคาของ radius ซงึ่ code ทั้งหมดของโปรแกรมตวั น้ี มดี ังน้ี ภาควิชาคอมพิวเตอรธ ุรกิจ วทิ ยาลยั ฟารอ สี เทอรน
บทที่ 5 Objects และ Classes 144เริม่ ตน กบั Java//PassByReference.java//a Circle class to demonstrate pass-by-reference schemeclass Circle { private double radius; //a radius of a circle//constructor to initialize radiusCircle(double r) { radius = r;}//method to calculate area of a circlepublic double area() { return Math.PI * radius * radius;}//a method to change radius of a given circlepublic Circle change(Circle c, double radius) { c.changeRadius(radius); //calling method changeRadius() return c; //with a given radius}//a method to change a given radiusprivate void changeRadius(double r) { radius = r;} //a method to return radius public double getRadius() { return radius; }}//a class to test pass-by-reference schemeclass PassByReference { public static void main(String[] args) { //create a red circle with a radius of 5.0; Circle red = new Circle(5.0); //calculate area of a red circle double area = red.area(); System.out.println(\"Radius of red circle is \" + red.getRadius()); System.out.println(\"Area of red circle is \" + area); //change radius of a red circle red.change(red, 2.0); area = red.area(); System.out.println(\"Radius of red circle now is \" + red.getRadius()); System.out.println(\"Area of red circle now is \" + area); }}เรามี class อยสู อง class โดยที่ class ตัวแรก หรอื class Circle เปน class ทเ่ี อาไวใชส รา งวงกลม ตา ง ๆรวมไปถงึ method หรอื กระบวนการตา ง ๆ ทเ่ี ราตองการใชใ นการเปลี่ยนแปลง หรือกําหนดคา ใหก บั ภาควิชาคอมพิวเตอรธรุ กิจ วิทยาลยั ฟารอ สี เทอรน
บทท่ี 5 Objects และ Classes 145เรมิ่ ตน กบั Javaวงกลมนนั้ ๆ สว น class ตวั ทส่ี องเปน class ท่ใี ชสําหรับการทดสอบ การสรา ง object จาก class Circleและตรวจสอบการสงคา แบบ pass-by-reference หลงั จากทท่ี ดลอง run เรากไ็ ดผ ลลพั ธด งั น้ีRadius of red circle is 5.0Area of red circle is 78.53981633974483Radius of red circle now is 2.0Area of red circle now is 12.566370614359172จากผลลพั ธเราจะเห็นวา ประโยคท่ีแสดงคาของ radius น้ันแสดงคา ไดถ กู ตอ งทัง้ กอน และหลังการเปลี่ยนแปลงคา ของ radiusสิ่งทเ่ี ราตอ งจําไวในเรอื่ งของการสงคาใหก บั method ก็คือ การสง คา ที่เปน primitive type เชน int หรอืdouble น้ัน method จะไดรับแตเ พยี งคา เทานัน้ การเปลีย่ นแปลงใด ๆ ภายใน method จะไมม ผี ลกระทบตอ ตวั แปรดานนอก แตถา เราสง object ไปให method การเปล่ียนแปลงทีเ่ กิดขึน้ ภายใน method (ตอตัวแทนของ object นัน้ ๆ) จะมผี ลกระทบตอ object ท่ีอยภู ายนอกดวยสมมตวิ าเราตอ งการที่จะทาํ การสลับคาของตวั แปรสองตวั ผา นทาง method เราจะทาํ อยา งไร? เรามาลองดตู ัวอยา งแรกกนั กอ นวา จะทาํ ใหเ ราไดห รอื ไม//Swap.javaimport java.io.*;class Values { int val1; int val2; //default constructor Values() { val1 = val2 = 0; } //assignment constructor Values(int a, int b) { val1 = a; val2 = b; } //display val1 and val2 public void show() { System.out.println(\"(\" + val1 + \", \" + val2 + \")\"); }}class Swap { public static void main(String[] args) { //create two objects from Values Values obj1 = new Values(10, 20); Values obj2 = new Values(30, 50); obj1.show(); //display values of obj1 obj2.show(); //display values of obj2 swap(obj1, obj2); //swap contents of obj1 and obj2 obj1.show(); obj2.show(); ภาควิชาคอมพิวเตอรธุรกิจ วทิ ยาลยั ฟารอสี เทอรน
Search
Read the Text Version
- 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
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 150
- 151
- 152
- 153
- 154
- 155
- 156
- 157
- 158
- 159
- 160
- 161
- 162
- 163
- 164
- 165
- 166
- 167
- 168
- 169
- 170
- 171
- 172
- 173
- 174
- 175
- 176
- 177
- 178
- 179
- 180
- 181
- 182
- 183
- 184
- 185
- 186
- 187
- 188
- 189
- 190
- 191
- 192
- 193
- 194
- 195
- 196
- 197
- 198
- 199
- 200
- 201
- 202
- 203
- 204
- 205
- 206
- 207
- 208
- 209
- 210
- 211
- 212
- 213
- 214
- 215
- 216
- 217
- 218
- 219
- 220
- 221
- 222
- 223
- 224
- 225
- 226
- 227
- 228
- 229
- 230
- 231
- 232
- 233
- 234
- 235
- 236
- 237
- 238
- 239
- 240
- 241
- 242
- 243
- 244
- 245
- 246