Lecture2 Array อ.เหมรัศมิ์ วชิรหัตถพงศ์ คณะวิทยาการสารสนเทศ มหาวิทยาลัยบูรพา
Problems ถ้าต้องเก็บข้อมูลความถี่ของคะแนน ของนิสิตในแต่ละช่วงคะแนน เช่น 100 คะแนน 1 คน 99 คะแนน 0 คน 98 คะแนน 5 คน … 0 คะแนน 1 คน
การใช้ Array อาจจะต้องสร้างตัวแปร counter จำนวน 100 ตัว เพื่อใช้นับจำนวนของแต่ละคะแนน int counter1, counter2, counter3, ....., counter10; int counter11, counter12, counter13, ..., counter20; int counter21, counter22, counter23, ....., counter30; ......... int counter91, counter92, counter93, ..., counter100; int percentage;
Array ตัวแปรแบบอาร์เรย์ (Array) หรือตัวแปรแถว ลำดับ หมายถึงตัวแปรซึ่งมีค่าได้หลายค่าโดยใช้ ชื่ออ้างอิงเพียงชื่อเดียว ด้วยการใช้หมายเลข ลำดับเป็นตัวจำแนกความแตกต่างของค่าตัวแปร แต่ละตัว
Solving for (int i=0; i<numStudentsInClass; i++) { // รับค่าคะแนนจากผู้ใช้ percentage = input.nextInt(); // เงื่อนไขการนับ switch(percentage) { case 1: counter1++; break; case 2: counter2++; break; case 3: counter3++; break; ...... case 100: counter100++; break; } }
Variables รูปแบบ ชื่อตัวแปรอาร์เรย์ = new ชนิดข้อมูล [ขนาดของอาร์เรย์] ตัวอย่าง int[] scores; scores = new int[50];
อีกวิธีในการสร้างอาร์เรย์ 1. ประกาศ ให้ตัวแปรชื่อ scores เป็น อาร์เรย์ของ int int[] scores; 2. จองพื้นที่ ใช้คำสั่ง new พร้อมกับระบุว่า ต้องการจองพื้นที่เก็บตัวแปรกี่ตัว scores = new int[3]; 3. กำหนดค่า ตัวแปรแต่ละตัวในอาร์เรย์ scores[0] = 30; scores[1] = 50; scores[2] = 85;
ลำดับที่ในอาร์เรย์ int[] sc; sc = new int[5]; หรือ 12 3 43 27 56
คุณสมบัติของ Array ของ Java indexed คือสามารถเข้าถึงสมาชิก (Element) แต่ ละตัวได้โดยอาศัย index หรือ ดัชนี ซึ่งจะเป็น ตัวเลข มี 0 เป็นค่าเริ่มต้น fixed size เมื่อสร้าง array แล้ว จะไม่สามารถเพิ่ม หรือ ลบ สมาชิก strongly typed and homogeneous นั่นคือ สมาชิกทุกตัวต้องมีชนิดข้อมูลเดียวกัน bounds-checked ถ้าเราพยายาม access สมาชิกที่ เกินขนาดของ array แล้ว java จะหยุดคำสั่งนั้น
ค่าเริ่มต้นของ elements เมื่อสร้าง array ใหม่ ข้อมูลภายใน array จะ ยังไม่มีข้อมูล ดังนั้นjava จึงกำหนดค่า default เป็นค่าเริ่มต้นของ elements แต่ละ ชนิดดังนี้ ตัวเลข = 0 boolean = false reference = null character = null
การกำหนดค่า ใช้เครื่องหมายปีกกาในการกำหนดค่าข้อมูลให้กับ สมาชิกใน Array int[] ages = {34, 12, 45}; double[] heights = {4.5, 23.6, 84.124, 78.2, 61.5}; boolean[] tired = {true, false, false, true}; String[] names = {"Bill","Jennifer","Joe"}; char vowels[] = {'a', 'e', 'i', 'o', 'u'};
Array of objects การเข้าถึงสมาชิกใน Array แบบ Object จะต้องระมัดระวัง ดังนี้ ตัวอย่างนี้ customers[0] จะมีค่าเป็น null การเรียก customers[0].getName() จึงเกิด error Customer[] customers = new Customer[1000]; System.out.println(customers[0].getName());
Array of objects: ที่ถูกต้องจะต้อง Assign ค่าก่อนการเรียกใช้ Customer[] customers = new Customer[1000]; customers[0] = new Customer("Jim"); System.out.println(customers[0].getName());
Size of Array เราสามารถทราบขนาดของ array ด้วยการเรียกใช้ ตัวแปร length ตัวแปร length ของ array ไม่สามารถเปลี่ยนค่าได้ double[] heights = {4.5, 23.6, 84.124, 78.2, 61.5}; String[] names = {"Bill","Jennifer","Joe"}; System.out.println(heights.length); // prints 5 System.out.println(names.length); // prints 3 names[1] = null; // erases Jennifer System.out.println(names.length); // still prints 3
การวนลูปเพื่อเขียน/อ่านข้อมูล รูปแบบ for ( ชนิดข้อมูลที่เก็บในอาร์เรย์ ตัวแปร : อาร์เรย์) { // คำสั่งในลูปที่ใช้ ตัวแปร } ตัวอย่าง double[] scores = { 30, 50, 85, 10, 45 }; for( double s : scores) { System.out.println(s);
Solving using Array จากปัญหาการหาความถี่คะแนน สามารถใช้ array ได้ดังนี้ int counter[] = new int[101]; int percentage; for (int i=0; i<numStudentsInClass; i++) { // Get the percentage from the user percentage = input.nextInt(); // Now update the appropriate counter counter[percentage]++; }
การอ้างเกินขอบเขต public class TestOutOfBound { public static void main(String[] args) { int[] scores = { 30, 50, 85, 10, 45 }; scores[5] = 10; }
Array of String String[] test = new String[3]; test[0] = "Hello"; test[1] = "Java"; test[2] = "World";
Array of String String[] test = { "Hello", "Java", "World"}; StringBuffer[] sb = { new StringBuffer("Hello"), new StringBuffer("Java"), new StringBuffer("World") };
คลาส Arrays
เมธอดในคลาส java.util.Arrays sort() ใช้เพื่อเรียงลำดับข้อมูลในอาร์เรย์ binarySearch() ใช้ค้นหาข้อมูลในอาร์เรย์ ผลของการค้นหาคืออินเด็กซ์(ตำแหน่ง)ใน อาร์เรย์ ก่อนที่จะค้นหาเราต้องเรียงลำดับข้อมูล เสียก่อน
การเรียงจำนวนเต็มโดยใช้คลาส Arrays java.util.Arrays.sort(score);
ตัวอย่างการเรียงลำดับจำนวนเต็ม int[] score={45,5,87,13,24}; Arrays.sort(score); หรือ java.util.Arrays.sort(score);
การเรียงวัตถุโดยใช้คลาส Arrays {"Jamies", "Amy", "Leo", "James"} import java.util.Arrays; ... Arrays.sort(names); {"Amy", "James", "Jamies", "Leo"}
การเรียงวัตถุโดยใช้คลาส Arrays import java.util.Arrays; public class SortString { public static void main(String[] args) { String[] names = { "Jamies", "Amy", "Leo", "James" }; Arrays.sort(names); System.out.println(Arrays.asList(names)); } Import คลาสอาร์เรย์ พิมพ์ชื่อทั้งหมดในอาร์เรย์
การเรียงชื่อภาษาไทย (แบบผิด) Arrays.sort(names); วัตถุในคลาส String ไม่รู้จักวิธีการเปรียบเทียบคำในภาษาไทย 555
การค้นหาโดยใช้คลาส Arrays เมธอด binarySearch( ) ถ้าพบ จะส่งตำแหน่งที่พบกลับมาให้ ถ้าไม่พบ จะส่งค่าติดลบมาให้
ตัวอย่างการค้นหา int[] id = {51, 3, 81, 20, 14}; Arrays.sort(id); int index = Arrays.binarySearch(id, 51); System.out.println(index);
อาร์เรย์สองมิติ ลักษณะเป็นตาราง
การสร้างอาร์เรย์สองมิติ รูปแบบ ชนิดข้อมูล[][] ตัวแปร = { อาร์เรย์แถวแรก, อาร์เรย์แถวที่สอง, ... }; ตัวอย่าง int[][] table = { { 1, 2, 3, 4},{ 5, 6, 7, 8}, { 9, 10, 11, 12}};
การระบุตำแหน่งในอาร์เรย์สองมิติ Index ตัวแรกจะระบุแถวและ Index ตัวที่ สองจะระบุคอลัมน์ รูปแบบ อาร์เรย์[แถว][คอลัมน์] ตัวอย่าง table[1][2]
การระบุตำแหน่งของตัวแปรในอาร์เรย์สองมิติ
การใช้งานอาร์เรย์สองมิติ ประกาศ int[][] table; จองพื้นที่ table = new int[3][4]; อ้างถึง table[0][0] = 3; table[0][1] = 5; table[0][2] = 8; table[0][3] = 7;
แต่ละแถวของอาร์เรย์สองมิติไม่จำเป็นต้องมีขนาดเท่ากัน
ตัวอย่าง int[][] twoD = { { 1, 2, 3}, { 4, 5, 6, 7}, { 4, 5, 6, 7}, { 8, 9, 10, 11, 12}}; System.out.println(twoD[1][2]);
อาร์เรย์สามมิติ
การระบุตำแหน่งในอาร์เรย์สามมิติ Index ตัวแรกจะแทน แผ่นงาน Index ตัวที่ สองจะแทนแถว Index ตัวที่ 3 จะแทน คอลัมน์ รูปแบบ อาร์เรย์[แผ่น][แถว][คอลัมน์]
END!