290 likes | 386 Views
CS@KKU Java Summer Camp 2011. Day 1 - 3 เรื่อง Array. Introduction. Arrays are commonly used efficient data structures. They allow us to group data together in an efficient manner. . ปัญหา. ถ้าต้องเก็บข้อมูลสถิติความถี่ของคะแนนของนักเรียน มีคนได้แต่ล่ะคะแนนกี่คน เช่น
E N D
CS@KKU Java Summer Camp 2011 Day 1 - 3 เรื่อง Array โดย วชิราวุธ ธรรมวิเศษ
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; } }
การแก้ปัญหา • จากตัวอย่างโปรแกรม คงจะพอมองเห็นปัญหาแล้วว่าการจัดการตัวแปรแบบนี้ คงเหนื่อยในการเขียนโปรแกรม • 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 JenniferSystem.out.println(names.length); // still prints 3
การแก้ปัญหาด้วย Array • จากปัญหาการหาความถี่คะแนน สามารถใช้ array ได้ดังนี้ int counter[] = newint[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]++; }
ตัวอย่าง การหาค่าเฉลี่ย publicclass 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; } } publicclass CalculatorTester { public staticvoid 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) • การใช้งาน array ที่มีหลายมิติ • 2 มิติ หรือ มากกว่า ที่ใช้มากจะเป็น 2 มิติ • Array แบบ 2 มิติใช้เพื่อ แทนข้อมูล • ตาราง • รูปภาพ (image) • Grid • แผนที่ • ฯลฯ
รูปแบบการเขียน ชนิดข้อมูล tableName[][] = newtypeOrObject[rowLimit][columnLimit]; ชนิดข้อมูล tableName[][] = {{row1Data}, {row2Data}, ..., {lastRowData}}; int myTable[][] = newint[4][3];
การเข้าถึง element • To access elements of the table, we merely index it by the row and the column of the element. int myTable[][] = newint[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 มิติ • แผนที่