CS@KKU Java Summer Camp 2011 Day 1 - 3 เรื่อง Array 5 เมษายน 2560 โดย วชิราวุธ ธรรมวิเศษ
Introduction Arrays are commonly used efficient data structures. They allow us to group data together in an efficient manner.
ปัญหา ถ้าต้องเก็บข้อมูลสถิติความถี่ของคะแนนของนักเรียน มีคนได้แต่ล่ะคะแนนกี่คน เช่น 100 คะแนน 1 คน 99 คะแนน 0 คน 98 คะแนน 5 คน … 0 คะแนน 1 คน
การแก้ปัญหา เรา อาจจะต้องสร้างตัวแปร counter จำนวน 100 ตัว เพื่อใช้นับจำนวนของแต่ละคะแนน int counter1, counter2, counter3, ....., counter10; int counter11, counter12, counter13, ..., counter20; int counter21, counter22, counter23, ....., counter30; ......... int counter91, counter92, counter93, ..., counter100; int percentage;
การแก้ปัญหา การเขียนโปรแกรม ก็ต้องเขียนแบบนี้ for (int i=0; i<numStudentsInClass; i++) { // รับค่าคะแนนจากผู้ใช้ percentage = Keyboard.getInteger(); // เงื่อนไขการนับ switch(percentage) { case 1: counter1++; break; case 2: counter2++; break; case 3: counter3++; break; ...... case 100: counter100++; break; } }
การแก้ปัญหา An Array is a bounded (fixed size) จากตัวอย่างโปรแกรม คงจะพอมองเห็นปัญหาแล้วว่า การจัดการตัวแปรแบบนี้ คงเหนื่อยในการเขียนโปรแกรม Array จึงเข้ามาช่วย จัดการปัญหาตรงจุดนี้ An Array is a bounded (fixed size) collection of elements of the same type.
คุณสมบัติของ Array ของ Java indexed คือสามารถเข้าถึงสมาชิก (Element) แต่ละตัวได้โดยอาศัย index หรือ ดัชนี ซึ่งจะเป็นตัวเลข มี 0 เป็นค่าเริ่มต้น fixed size เมื่อสร้าง array แล้ว จะไม่สามารถเพิ่ม หรือ ลบ สมาชิก strongly typed and homogeneous นั่นคือสมาชิกทุกตัวต้องมีชนิดข้อมูลเดียวกัน bounds-checked ถ้าเราพยายาม access สมาชิกที่เกินขนาดของ array แล้ว java จะหยุดคำสั่งนั้น
Arrays Unlike many other data structures, access to array elements is immediate since they are stored in contiguous (i.e., side by side) memory locations.
การประกาศตัวแปรแบบ array Variables that hold arrays are declared using square brackets []. The brackets may appear either with the variable’s type: int [] data; or with the variable's name: int data[];
การสร้าง Array Array ถือว่าเป็น class ชนิดหนึ่ง การสร้าง array จะใช้คำสั่ง new เหมือนการสร้าง object แต่ใช้เครื่องหมาย [ ] ระบุขนาด int x[]; x = new int[100]; ต้องระบุขนาดของ array ด้วยและเมื่อ array ถูก new แล้ว เราจะไม่สามารถเปลี่ยนขนาดของ array ได้อีก
การสร้าง Array Just like any other variables, both declaration and creation can occur on the same line: int x[] = new int[100]; int[] sickDays = new int[30]; Person[] friends = new Person[50];
ค่าเริ่มต้นของ elements เมื่อสร้าง array ใหม่ ข้อมูลภาย array จะยังไม่มี ดังนั้นjava จึงกำหนดค่า default เป็นค่าเริ่มต้นของ elements แต่ละชนิด ตัวเลข = 0 boolean = false reference = null character = null
ค่าเริ่มต้นของ elements When you create an array of reference types, only the array itself is created. The array is NOT initialized with new objects in each location.
การกำหนดค่าให้ elements เหมือนตัวแปรปกติ แต่เพิ่ม [index] int[] ages = new int[3]; // valid indices are 0,1 & 2 ages[0] = 34; ages[1] = 12; ages[2] = 45; ข้อควรระวัง การ access เกินขนาดของ array ages[3] = 29; // ERROR: 3 is an invalid index
การกำหนดค่าให้ elements พร้อมๆกัน ใช้เครื่องหมายปีกกา ไม่ต้องใช้ new 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'};
การกำหนดค่าให้ elements พร้อมๆกัน ใช้เครื่องหมายปีกกา BankAccount[] accounts = { new BankAccount("Fred", 100.00), new BankAccount("Biff", 2380.00), new BankAccount("Martha", 500.00), new BankAccount("Jim", 175.56), new BankAccount("Betty", 924.02) };
Array of objects: Always be careful when accessing an arrays of objects: ตัวอย่างนี้ customers[0] จะมีค่าเป็น null การเรียก customers[0].getName() จึงเกิด error Customer[] customers = new Customer[1000]; System.out.println(customers[0].getName());
Array of objects: Make sure to assign values to the array BEFORE trying to use them: Customer[] customers = new Customer[1000]; customers[0] = new Customer("Jim"); System.out.println(customers[0].getName());
ขนาดของ 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
การแก้ปัญหาด้วย Array int counter[] = new int[101]; int percentage; for (int i=0; i<numStudentsInClass; i++) { // Get the percentage from the user percentage = Keyboard.getInteger(); // Now update the appropriate counter counter[percentage]++; }
ตัวอย่าง การหาค่าเฉลี่ย public class Calculator { public static double calculateAverage(int[] numbers) { int sum = 0; for (int i=0; i<numbers.length; i++) sum += numbers[i]; return sum/(double)numbers.length; } } public class CalculatorTester { public static void main(String args[]) { int numbers[] = {23, 54, 88, 98, 23, 54, 7, 72, 35, 22}; System.out.println("The average is " + Calculator.calculateAverage(numbers)); } }
การส่งตัวแปร Array เป็น parameter Notice that when passing an array as a parameter, we DO NOT use the square brackets: Calculator.calculateAverage(numbers[]) we DO NOT specify the type either: Calculator.calculateAverage(int numbers[])
ตัวอย่าง : หาค่า maximum Given an array of 10 numbers, how do we find the maximum ? int numbers[] = {23, 54, 88, 98, 23, 54, 7, 72, 35, 22}; int max = -999999; for (int i=0; i<numbers.length; i++) { if (numbers[i] > max) max = numbers[i]; } System.out.println("The maximum is " + max);
Multi-Dimensional Arrays (Tables) 2 มิติ หรือ มากกว่า ที่ใช้มากจะเป็น 2 มิติ Array แบบ 2 มิติใช้เพื่อ แทนข้อมูล ตาราง รูปภาพ (image) Grid แผนที่ ฯลฯ
รูปแบบการเขียน int myTable[][] = new int[4][3]; ชนิดข้อมูล tableName[][] = new typeOrObject[rowLimit][columnLimit]; ชนิดข้อมูล tableName[][] = {{row1Data}, {row2Data}, ..., {lastRowData}}; int myTable[][] = new int[4][3];
การเข้าถึง element To access elements of the table, we merely index it by the row and the column of the element. int myTable[][] = new int[4][3]; myTable[0][0] = 34; myTable[0][1] = 15; myTable[1][3] = 26;
ตัวอย่าง int myTable[][] = {{23, 45, 65, 34, 21, 67, 78}, {46, 14, 18, 46, 98, 63, 88}, {98, 81, 64, 90, 21, 14, 23}, {54, 43, 55, 76, 22, 43, 33}};
ตัวอย่าง : เขียนคำสั่งแสดง int myTable[][] = {{23, 45, 65, 34, 21, 67, 78}, {46, 14, 18, 46, 98, 63, 88}, {98, 81, 64, 90, 21, 14, 23}, {54, 43, 55, 76, 22, 43, 33}}; for (int row=0;row<4; row++) { for (int col=0;col<7; col++) System.out.print(myTable[row][col] + " "); System.out.println(); }
Array แบบ 3 มิติ int cube[][][] = new int[3][3][3]; ใช้เก็บข้อมูลแบบ 3 มิติ แผนที่