6  แถวลำดับ

วัตถุประสงค์

  1. เพื่อให้สามารถสร้างและใช้งานอาร์เรย์ในการเขียนโปรแกรมได้

  2. เพื่อให้สามารถสร้างและใช้งานอาร์เรย์สองมิติในการเขียนโปรแกรมได้

  3. เพื่อให้สามารถใช้งานอาร์เรย์และอาร์เรย์สองมิติร่วมกับการทำงานแบบวนซ้ำได้

  4. เพื่อให้สามารถอธิบายความสำคัญของการใช้อาร์เรย์ในการเขียนโปรแกรม

ในระหว่างการประมวลผลของโปรแกรมมักจะจัดเก็บข้อมูลจำนวนมาก เช่น ข้อมูลคะแนนสอบของนักศึกษา 40 คน ข้อมูลอุณหภูมิในแต่ละวันภายใน 1 ปีหรือ 365 วัน เพื่อหาค่าเฉลี่ยของข้อมูล เป็นต้น ดังนั้นจะต้องสร้างตัวแปรขึ้นมาเก็บข้อมูลเหล่านี้ เช่น ข้อมูลคะแนนสอบของนักศึกษา 40 คนต้องประกาศตัวแปร 40 ตัว และต้องเขียนโปรแกรมด้วยคำสั่งซ้ำเดิม 40 ครั้ง เพื่อรับค่าข้อมูลและหาค่าผลของคะแนนทั้งหมด จึงเป็นสิ่งที่ไม่สะดวก แต่เราสามารถที่จะใช้โครงสร้างข้อมูลที่เรียกว่าแถวลำดับหรืออาร์เรย์ (array) ซึ่งมีการจัดเก็บข้อมูลชนิดเดียวกันโดยใช้เลขลำดับเป็นตัวระบุถึงข้อมูลแต่ละตัวทำให้การเข้าถึงข้อมูลทำได้ง่าย และสามารถใช้การเขียนโปรแกรมแบบวนซ้ำเข้ามาช่วยในการรับค่าข้อมูลมาใส่ในอาร์เรย์รวมถึงการนำข้อมูลในอาร์เรย์มาใช้งาน

6.1 โครงสร้างข้อมูลแบบแถวลำดับหรืออาร์เรย์

แถวลำดับหรืออาร์เรย์ คือแถวที่ใช้เก็บกลุ่มของข้อมูลประเภทเดียวกันหรือชนิดเดียวกันเรียงต่อกันเป็นลำดับ ข้อมูลในอาร์เรย์จะถูกเก็บอยู่ในหน่วยความจำในตำแหน่งที่ต่อเนื่องกัน ถ้าเปรียบเทียบตัวแปรเหมือนกล่องที่ใช้เก็บค่าข้อมูล อาร์เรย์จะเปรียบเหมือนกล่องที่เรียงติดกันหลายใบซึ่งมีเลขลำดับเป็นตัวชี้บอกถึงกล่องแต่ละใบโดยตัวเลขนี้จะเริ่มต้นที่ 0 ดังภาพที่ 6-1

ภาพที่ 6-1 ภาพแสดงอาร์เรย์เมื่อเปรียบเทียบเป็นกล่องที่เอาไว้ใส่ค่าข้อมูล

ดังนั้นการอ้างถึงตัวแปรจะต้องเรียกชื่อ เช่น score1, score2, \(\cdots\), score40 กรณีมีตัวแปร 40 ตัว แต่อาร์เรย์จะใช้ชื่อเดียว เช่น score และใช้ score[0], score[1], \(\cdots\), score[39] แทนข้อมูลแต่ละตัวในอาร์เรย์

6.2 การสร้างและการใช้งานอาร์เรย์

ในการใช้งานอาร์เรย์จะต้องทำการประกาศอาร์เรย์เพื่อให้ทราบว่าอาร์เรย์นั้นจะใช้เก็บข้อมูลประเภทใด ไวยากรณ์ในการประกาศอาร์เรย์เป็นดังนี้

แบบที่ 1
ชนิดข้อมูล[]  ชื่ออาร์เรย์;
แบบที่ 2
ชนิดข้อมูล  ชื่ออาร์เรย์[];
นิยมใช้การประกาศแบบที่ 1 มากกว่า   ตัวอย่างการประกาศ เช่น

::: {.columns}

แบบที่ 1
int[ ] i; 
int[ ] i,j;
double[ ] score;
char[ ]  grade;
แบบที่ 2
int i[ ]; 
int i[ ], j[ ];
double score[ ];
char grade[ ];

ในการประกาศอาร์เรย์เป็นเพียงการระบุว่าอาร์เรย์นั้นใช้จัดเก็บข้อมูลชนิดใดและสร้างตำแหน่งของหน่วยความจำที่ใช้อ้างถึงอาร์เรย์ แต่ยังไม่ได้มีการจองหรือจัดสรรเนื้อที่ในหน่วยความจำให้กับอาร์เรย์ ดังนั้นในการใช้งานอาร์เรย์เมื่อประกาศอาร์เรย์แล้วจะต้องทำการสร้างอาร์เรย์โดยใช้ตัวดำเนินการ new โดยขนาดของอาร์เรย์จะต้องเป็นจำนวนเต็ม ไวยากรณ์ในการสร้างอาร์เรย์เป็นดังนี้

ชื่ออาร์เรย์ = new ชนิดข้อมูล [ขนาดของอาร์เรย์];

ตัวอย่างการสร้างอาร์เรย์ เช่น

//การสร้างอาร์เรย์ชื่อ i ซึ่งเป็นชนิด int ให้มีขนาด 5 ช่อง
  i = new int[5]; 
//การสร้างอาร์เรย์ชื่อ score ซึ่งเป็นชนิด double ให้มีขนาด 10 ช่อง 
  score = new double[10]; 
//การสร้างอาร์เรย์ชื่อ grade ซึ่งเป็นชนิด char ให้มีขนาด 8 ช่อง 
  grade = new char[8]; 

เราสามารถที่จะดำเนินการประกาศและสร้างอาร์เรย์ไปพร้อมกันได้ โดยมีรูปแบบคำสั่งดังต่อไปนี้

แบบที่ 1
ชนิดข้อมูล[] ชื่ออาร์เรย์ = new ชนิดข้อมูล [ขนาดของอาร์เรย์] ;
แบบที่ 2
ชนิดข้อมูล ชื่ออาร์เรย์[] = new ชนิดข้อมูล [ขนาดของอาร์เรย์] ;

ตัวอย่างการประกาศและสร้างตัวแปรพร้อมกัน เช่น

int[ ] score = new int[10];  \\หรือ
    int score[ ] = new int[10];
boolean toonAlive[] = new boolean[5];
    int toonAge[] = new int[5];
double toonWeight[] = new double[5];
    String toonName[] = new String[5];

ตัวอย่างการประกาศอาร์เรย์แล้วจึงสร้างอาร์เรย์ เช่น

ตัวอย่างการประกาศและสร้างตัวแปรพร้อมกัน เช่น

float score[];
    score = new float[10];  
    char toonGender[];
    toonGender = new char[5];
ตัวอย่างที่ 6.1 โปรแกรม ArrayEx1.java
public class ArrayEx1  {
        public static void main (String[] args) {
            //ประกาศอาร์เรย์
            double score[];
            char[] grade;
            int i[], j[];

            //การสร้างอาร์เรย์
            i = new int[5];
            j = new int[3];
            score = new double[10];
            grade = new char[8];
        
            //ประกาศอาร์เรย์และสร้างอาร์เรย์พร้อมกัน
            double temp[] = new double[10];
            int[] num = new int[5];
        }
    }   

ตัวอย่างภาพจำลองของอาร์เรย์และตัวอย่างข้อมูลที่จัดเก็บในอาร์เรย์ชื่อ score ที่ใช้เก็บข้อมูลชนิด int ซึ่งมีสมาชิก 10 ตัว ในภาษาจาวาเลขลำดับซึ่งเป็นตัวชี้หรือดัชนี (index) จะเริ่มจากเลขลำดับที่ 0 ดังนั้นอาร์เรย์ score จะมีตัวชี้ตำแหน่งตั้งแต่ 0 ถึง 9 ดังนี้

ภาพที่ 6-2 ภาพจำลองอาร์เรย์ชื่อ score ใช้เก็บข้อมูลชนิด int ซึ่งมีสมาชิก 10 ตัว

การอ้างอิงข้อมูลในแต่ละตำแหน่งของอาร์เรย์ มีไวยากรณ์ดังนี้

ชื่ออาร์เรย์ [ดัชนี]

เมื่อ ดัชนี คือตำแหน่งของข้อมูลในอาร์เรย์ที่ต้องการอ้างถึง เช่นจากภาพที่ 2-2 เมื่อต้องการอ้างถึงข้อมูลเลขลำดับที่ 0 ทำได้โดยเขียนว่า score[0] ซึ่งจะทำให้ได้ข้อมูล คือ 7

การอ้างถึงตำแหน่งข้อมูลในอาร์เรย์นอกช่วงจะทำให้เกิดข้อผิดพลาดขึ้นซึ่งเกิดขึ้นกับนักเขียนโปรแกรมอยู่บ่อยครั้ง ข้อผิดพลาดในลักษณะนี้คือข้อผิดพลาดขณะทำงานเพราะการเขียนถูกต้องตามหลักไวยากรณ์แต่อ้างอิงตำแหน่งอาร์เรย์ที่ไม่มีอยู่จริง ดังตัวอย่างที่ 6.2

ตัวอย่างที่ 6.2 โปรแกรม ArrayEx2.java
public class ArrayEx2  {
     public static void main(String[ ] args)  {
            int[ ] numbers = new int[4];
            numbers[0] = 5;
            numbers[1] = 2;
            numbers[2] = 9;
            numbers[3] = 6;
      numbers[4] = 3;
      System.out.println("Complete Array Initialization!");  
         }   
      }

จากตัวอย่างที่ 6.2 บรรทัดที่ 8 มีการอ้างถึงอาร์เรย์ numbers ในตำแหน่งที่ 4 ซึ่งเกินจากขอบเขตของดัชนีของอาร์เรย์นี้ที่มีค่าอยู่ในช่วง 0 ถึง 3 เท่านั้น ทำให้โปรแกรมเกิดข้อผิดพลาดขึ้นในขณะทำงานส่งผลให้โปรแกรมหยุดการทำงาน

6.3 การกำหนดค่าให้กับอาร์เรย์

การกำหนดค่าให้กับอาร์เรย์หรือการนำข้อมูลไปใส่ในอาร์เรย์สามารถทำได้หลายวิธี เช่น

วิธีที่ 1 กำหนดค่าข้อมูลให้อาร์เรย์ด้วยการระบุดัชนี

วิธีที่ 2 กำหนดค่าเริ่มต้นให้กับอาร์เรย์ร่วมกับการประกาศอาร์เรย์

วิธีที่ 3 กำหนดค่าข้อมูลให้อาร์เรย์โดยใช้การทำงานแบบวนซ้ำ

วิธีท่ี 1 การกำหนดค่าข้อมูลให้อาร์เรย์ด้วยการระบุดัชนี   คำสั่งในการกำหนดค่าให้กับสมาชิกแต่ละตัวในอาร์เรย์มีรูปแบบไวยากรณ์ ดังนี้
ชื่ออาร์เรย์ [ดัชนี] = ค่าที่ต้องการกำหนดให้อาร์เรย์ ;
ตัวอย่างที่ 6.3

วิธีที่ 2 การประกาศอาร์เรย์ร่วมกับการกำหนดค่าเริ่มต้นให้กับอาร์เรย์ มีรูปแบบไวยากรณ์ดังนี้

ชนิดข้อมูล  ชื่ออาร์เรย์  = {ค่าลำดับที่ 0, ..., ค่าลำดับที่ k} ;

คำสั่งนี้เป็นการดำเนินการประกาศอาร์เรย์ สร้างอาร์เรย์ และกำหนดค่าให้กับอาร์เรย์ภายในคำสั่งเดียว อาร์เรย์ที่ถูกสร้างขึ้นจะมีขนาดเท่ากับชุดของข้อมูลที่กำหนดให้เป็นค่าเริ่มต้น ดังตัวอย่างที่ 6.4

ตัวอย่างที่ 6.4
int num[] = {2, 5, 3, 1};
String[] monthName = { "January", "February", "March", "April", "May", "June", "July", 
                        "August", "September", "October", "November", "December};
System.out.println(“Size of array num =+ num.length);
System.out.println(“Size of array monthName =+ monthName.length);

ผลลัพธ์จากส่วนของโปรแกรมนี้ คือ

จากส่วนของโปรแกรมในตัวอย่างที่ 6.4 ทำให้ได้อาร์เรย์ชื่อ num ขนาด 4 ตัว ซึ่งมีสมาชิก คือ 2, 5, 3, และ 1 ตามลำดับ และอาร์เรย์ชื่อ monthName ซึ่งมีสมาชิก 12 ตัว เป็นชื่อของเดือนทั้ง 12 เดือนตามลำดับ นอกจากนี้แล้วเราสามารถทราบขนาดของอาร์เรย์ได้โดยใช้คุณสมบัติ length ของอาร์เรย์

วิธีที่ 3 การกำหนดค่าให้กับอาร์เรย์สามารถดำเนินการโดยใช้การทำงานแบบวนซ้ำ ดังตัวอย่างที่ 6.5

Size of array num = 4
Size of array monthName = 12
ตัวอย่างที่ 6.5
int num[ ] = new int[4];
for (int i = 0; i < 4; i++)   {
    num[ i ] =  i + 1;
    System.out.println(“Data in array num ” + i +=+ num[ i ]);
}
ผลลัพธ์จากส่วนของโปรแกรมนี้ คือ

Data in array num 0 = 1

Data in array num 1 = 2

Data in array num 2 = 3

Data in array num 3 = 4

จากส่วนของโปรแกรมในตัวอย่างที่ 6.5 จะเห็นได้ว่าเราสามารถนำเอาตัวแปร i ซึ่งเป็นตัวแปรที่ใช้ในการควบคุมการวนซ้ำมาเป็นค่าดัชนีของอาร์เรย์ แล้วกำหนดให้มีการทำวนซ้ำเท่ากับจำนวนสมาชิกของอาร์เรย์โดยให้ค่าเริ่มต้นของตัวแปร i = 0 เช่นเดียวกับเลขลำดับตัวแรกของอาร์เรย์ที่เริ่มต้นที่ 0 เงื่อนไขของอาร์เรย์กำหนดให้น้อยกว่าขนาดของอาร์เรย์ เนื่องจากดัชนีจะเริ่มต้นที่ 0 จนถึงตำแหน่งที่ length-1 ในที่นี้อาร์เรย์มีขนาด 4 จึงกำหนดเงื่อนไขเป็น i < 4 หรืออาจเปลี่ยนเงื่อนไขเป็น i < num.length แทนก็ได้ ในส่วนของการเปลี่ยนแปลงค่าตัวแปร i จะทำเมื่อสิ้นสุดการทำงานในวงวนแต่ละรอบโดยเพิ่มค่าทีละหนึ่งเพื่อเลื่อนไปพิจารณาสมาชิกในอาร์เรย์ตำแหน่งถัดไป

เมื่ออาร์เรย์สร้างเสร็จแล้วกรณีอาร์เรย์ชนิดตัวเลขภาษาจาวาจะกำหนดค่า 0 ให้เป็นค่าโดยปริยาย (default value) หรือก็คือค่าที่ภาษาจาวาจะใส่ลงในอาร์เรย์แบบอัตโนมัติทันทีที่สร้างอาร์เรย์ ดังตัวอย่างที่ 6.6 กรณีของอาร์เรย์ชนิดตัวอักษรค่าโดยปริยายที่ภาษาจาวากำหนดให้คือ ‘000’ และค่าโดยปริยายของอาร์เรย์ชนิด boolean คือค่า false

ตัวอย่างที่ 6.6 โปรแกรม ArrayEx6.java
public class ArrayEx6  {
    public static void main(String[ ] args)  {
    int  n = 3;
    double[ ] price = new double[5];
    System.out.println("Default value of price[0] is " + price[0]);
    System.out.println("Default value of price[1] is " + price[1]); 
    System.out.println("Default value of price[2] is " + price[2]);
        }   
    }   
ผลลัพธ์ของโปรแกรมคือ

Default value of price[0] is 0.0

Default value of price[1] is 0.0

Default value of price[2] is 0.0

จากโปรแกรมในตัวอย่างที่ 6.6 ค่าในอาร์เรย์ price มีค่าเท่ากับ 0.0 ซึ่งเป็นค่าโดยปริยาย

6.4 การค้นหาข้อมูลในอาร์เรย์ และการใช้งานอาร์เรย์ร่วมกับการวนซ้ำ

การใช้งานอาร์เรย์ร่วมกับการวนซ้ำทำให้การประมวลผลข้อมูลร่วมกับอาร์เรย์ทำได้ง่าย ตัวอย่างเช่น การค้นหาข้อมูลในอาร์เรย์สามารถดำเนินการเปรียบเทียบค่าที่ต้องการค้นหากับข้อมูลในอาร์เรย์โดยการวนซ้ำแล้วเปรียบเทียบค่าที่ต้องกันค้นหากับอาร์เรย์ไปทีละตัว นอกจากนี้ยังสามารถใช้ในการประมวลผลข้อมูลทางสถิติอย่างง่าย เช่น การหาค่าสูงสุด การหาค่าต่ำสุด การหาค่าผลรวมเพื่อใช้ในการหาค่าเฉลี่ย เป็นต้น

ตัวอย่างที่ 6.7 โปรแกรม ArrayEx7.java
import  java.util.Scanner;
    public class ArrayEx7 {
        public static void main(String[ ] args){
        Scanner sc = new Scanner(System.in);
        int  size  =  8;
        int[ ]  numbers  =  new int[size];
        int sum = 0;
//Read all numbers
    System.out.print("Enter a number :");
        for (int i = 0; i < numbers.length; i++) {  
          numbers[i]  =  sc.nextInt();
                  sum = sum + numbers[i];     
                  } 
//Find the largest
    int   max  =  numbers[0];
        for (int i = 0; i < numbers.length; i++) {
            if (max < numbers[i])
            max = numbers[i];
            }       
//Find the occurance of largest number
    int   count = 0;
    for (int i = 1; i < numbers.length; i++) {
        if (numbers[i]  ==  max)
            count++;
            }   
//Find the smallest
    int   min  =  numbers[0];
        for (int i = 1; i < numbers.length; i++) {
            if (min > numbers[i])
            min = numbers[i];
            }               
//Calculate the average
    double average = (double)sum/numbers.length;    
//Display the result
    System.out.print("The array is ");
        for (int i = 0; i < numbers.length; i++) {
            System.out.print(numbers[i] + "  ");
        }
    System.out.println("\nThe largest number is " + max);
    System.out.println("The occurance count of largest number is " + count);
    System.out.println("The smallest number is " + min);
    System.out.println("The sum of numbers is " + sum);
    System.out.println("The average of numbers is " + average);
        }
    }

ผลลัพธ์ของโปรแกรมเมื่อป้อนข้อมูล คือ 3 4 10 2 7 10 5 8 เป็นดังนี้

Enter 8 numbers: 3 4 10 2 7 10 5 8

The array is 3 4 10 2 7 10 5 8

The largest number is 10

The occurance count of largest number is 2

The smallest number is 2

The sum of numbers is 49

The average of numbers is 6.125

ผลลัพธ์ของโปรแกรมเมื่อป้อนข้อมูล คือ 7 8 4 9 5 9 2 9 เป็นดังนี้

Enter 8 numbers: 7 8 4 9 5 9 2 9

The array is 7 8 4 9 5 9 2 9

The largest number is 9

The occurance count of largest number is 3

The smallest number is 2

The sum of numbers is 53

The average of numbers is 6.625

จากโปรแกรมในตัวอย่างที่ 6.7

บรรทัดที่ 10 – 12 เป็นการวนซ้ำเพื่อรับค่าข้อมูลตัวเลขจำนวนเต็มมาใส่ในอาร์เรย์ชื่อ numbers ซึ่งมีขนาด 8 ช่อง นอกจากนี้แล้วในวงวนนี้ยังมีการบวกค่าตัวเลขเพื่อหาผลรวมทั้งหมดเก็บในตัวแปร sum ที่บรรทัดที่ 11 ในโปรแกรมนี้หากต้องการเพิ่มหรือลดจำนวนข้อมูลตัวเลขที่ต้องการจัดเก็บสามารถเปลี่ยนค่าของตัวแปร size ในบรรทัดที่ 5 เป็นจำนวนที่ต้องการได้

บรรทัดที่ 15 – 19 เป็นการหาค่าสูงสุดของชุดตัวเลขในอาร์เรย์ด้วยการกำหนดค่าตัวแปรที่ใช้เก็บข้อสูงสุดแรกเริ่มให้มีค่าเป็นอาร์เรย์ตำแหน่งที่ 0 แล้วใช้การวนซ้ำเพื่อเปรียบเทียบว่ามีข้อมูลใดในอาร์เรย์มีค่ามากกว่าค่า max บ้างก็จะทำการเปลี่ยนแปลงค่า max เป็นข้อมูลในอาร์เรย์ตำแหน่งนั้น ทำให้เมื่อวนซ้ำครบทุกสมาชิกในอาร์เรย์จะได้ค่าสูงสุดเก็บอยู่ในตัวแปร max

บรรทัดที่ 21 – 25 เป็นการค้นหาข้อมูลโดยต้องการนับว่ามีค่าที่เท่ากับตัวเลขที่มากที่สุด (max) อยู่กี่ตัว ในการดำเนินการค้นหาได้ใช้การวนซ้ำเพื่อเปรียบเทียบค่า max กับสมาชิกในอาร์เรย์ numbers ทีละตัว ถ้าค่าตรงกันจะทำการเพิ่มค่าของตัวแปร count ดังนั้นเมื่อสิ้นสุดการทำซ้ำจะทำให้ได้จำนวนของค่าที่เท่ากับค่า max เก็บอยู่ในตัวแปร count

บรรทัดที่ 28 – 31 เป็นการหาค่าต่ำสุดของชุดตัวเลขในอาร์เรย์โดยใช้การวนซ้ำเช่นเดียวกับการหาค่าสูงสุด แต่ในการเปรียบเทียบจะตรวจสอบว่ามีข้อมูลใดในอาร์เรย์มีน้อยกว่าค่า min หรือไม่ ถ้าค่าในอาร์เรย์ตำแหน่งนั้นมีค่าน้อยกว่าก็จะทำการเปลี่ยนแปลงค่า min เป็นค่าใหม่ตามค่าในอาร์เรย์ตำแหน่งนั้น

บรรทัดที่ 33 เป็นการหาค่าเฉลี่ยโดยการนำค่าผลรวมที่เก็บอยู่ในตัวแปร sum มาหารด้วยจำนวนข้อมูลทั้งหมด (numbers.lenth)

บรรทัดที่ 36 – 38 เป็นการแสดงข้อมูลในอาร์เรย์ด้วยการวนซ้ำเพื่อนำค่าในอาร์เรย์แต่ละตัวมาพิมพ์ออกทางจอภาพ

6.5 ตัวอย่างเปรียบเทียบโปรแกรมที่ใช้อาร์เรย์และไม่ใช้อาร์เรย์

จากเนื้อหาก่อนหน้านี้จะเห็นได้ว่าใช้อาร์เรย์ในการจัดเก็บชุดข้อมูลที่มีจำนวนมากทำให้การดำเนินการกับชุดข้อมูลนี้ทำได้ง่ายด้วยการใช้ดัชนีเพื่อระบุตำแหน่งข้อมูล และสามารถประมวลผลข้อมูลได้ง่ายขึ้นเพราะสามารถทำงานร่วมกับการวนซ้ำได้ ตัวอย่างต่อไปนี้เป็นการเปรียบเทียบการแก้ปัญหาเพื่อหาค่าเฉลี่ยของตัวเลข 10 จำนวน ด้วยการเขียนโปรแกรมแบบที่ไม่ใช้อาร์เรย์ (ตัวอย่างที่ 6.8) และใช้อาร์เรย์ (ตัวอย่างที่ 6.9) โดยโปรแกรมทั้งสองนี้จะใช้การรับค่าตัวเลขทางแป้นพิมพ์

ตัวอย่างที่ 6.8 โปรแกรม ArrayEx8.java
import java.util.Scanner;
    public class ArrayEx8 {
        public static void main (String args[]) {
                double var1, var2, var3, var4, var5, var6, var7, var8, var9, var10, avg;
                Scanner sc = new Scanner(System.in);
                System.out.print("Number 1: ");
                var1 = sc.nextDouble();
                System.out.print("Number 2: ");
                var2 = sc.nextDouble();
                System.out.print("Number 3: ");
                var3 = sc.nextDouble();
                System.out.print("Number 4: ");
                var4 = sc.nextDouble();
                System.out.print("Number 5: ");
                var5 = sc.nextDouble();
                System.out.print("Number 6: ");
                var6 = sc.nextDouble();
                System.out.print("Number 7: ");
                var7 = sc.nextDouble();
                System.out.print("Number 8: ");
                var8 = sc.nextDouble();
                System.out.print("Number 9: ");
            var9 = sc.nextDouble();
                System.out.print("Number 10: ");
                var10 = sc.nextDouble();
                avg = (var1+var2+var3+var4+var5+var6+var7+var8+var9+var10)/10;
                System.out.println("Average = " + avg);
        }
    }
ตัวอย่างที่ 6.9 โปรแกรม ArrayEx9.java
import java.util.Scanner;
    public class ArrayEx9 {
        public static void main (String args[]) {
                double vars[] = new double[10], avg, sum = 0;
                Scanner sc = new Scanner(System.in);
                for (int i = 0; i < vars.length; i++) {
                System.out.print("Number " + (i + 1) + ": ");
                vars[i] = sc.nextDouble();
                sum = sum + vars[i];
                }
                avg = sum / vars.length;
                System.out.println("Average = " + avg);
        }
    }   

ตัวอย่างที่ 6.8 และตัวอย่างที่ 6.9 จะให้การผลการทำงานที่เหมือนกัน แต่การใช้อาร์เรย์ดำเนินการรับชุดข้อมูลชนิดเดียวกันที่มีจำนวนมากจะทำการเขียนโปรแกรมได้ง่ายกว่าเพราะสามารถทำงานร่วมกับวงวนได้ แต่โปรแกรมที่ไม่ใช้อาร์เรย์จะต้องทำการประกาศตัวแปรทีละตัวและเขียนคำสั่งซ้ำเพื่อดำเนินการกับตัวแปรทีละตัวดังเห็นได้ว่าตัวอย่างที่ 6.8 ต้องใช้จำนวนบรรทัดมากกว่า หากต้องการเพิ่มจำนวนของข้อมูลเป็นการหาค่าเฉลี่ยของตัวเลข 20 ตัว สำหรับโปรแกรมในตัวอย่างที่ 6.9 สามารถทำได้ง่ายมากด้วยการเปลี่ยนขนาดของอาร์เรย์ในบรรทัดที่ 4 เป็น 20 เท่านั้น และถ้าต้องการหาค่าเฉลี่ยของตัวเลข 100 ตัวก็สามารถทำได้ด้วยการเปลี่ยนขนาดของอาร์เรย์เป็น 100 ช่อง

ตัวอย่างการเขียนโปรแกรมเพื่อรับตัวเลขวันในสัปดาห์ตั้งแต่ 1 - 7 แล้วให้แสดงชื่อวันออกทางจอภาพโปรแกรมในตัวอย่างที่ 6.10 ใช้อาร์เรย์ และโปรแกรมในตัวอย่างที่ 6.11 ใช้คำสั่ง switch-case เป็นดังนี้

ตัวอย่างที่ 6.10 ArrayEx10.java
import java.util.Scanner;
    public class ArrayEx10 {
        public static void main (String args[]) {
                String dof[] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, 
                            “Thursday”, “Friday”, “Saturday”,“Invalid day!};
                Scanner sc = new Scanner(System.in);
                System.out.print(“Enter day [17]:);
                int day = sc.nextInt();
                if (day < 1 || day > 7) 
                    System.out.println(dof[dof.length1]);
                else
                    System.out.println(dof[day – 1]);
            }    
    }
ตัวอย่างที่ 6.11 ArrayEx11.java
import java.util.Scanner;
    public class ArrayEx11 {
        public static void main (String args[]) {
                Scanner sc = new Scanner(System.in);
                System.out.print(“Enter day [17]:);
                int day = sc.nextInt();
                switch(day) {
                    case 1 :    System.out.println(“Sunday”);
                                    break;
                    case 2 :    System.out.println(“Monday”);
                                    break;
                    case 3:         System.out.println(“Tuesday”);
                                    break;
                    case 4 :    System.out.println(“Wednesday”);
                                    break;
                    case 5 :    System.out.println(“Thursday”);
                                    break;
                    case 6 :    System.out.println(“Friday”);
                                    break;
                    case 7 :    System.out.println(“Saturday”);
                                    break;
                    default :   System.out.println(“Invalid day!);
                                    break;
                }
        }
    }   

6.6 หลักการและแนวคิดของอาร์เรย์สองมิติ

อาร์เรย์สองมิติจะจัดเก็บข้อมูลอยู่ในรูปแบบของเมทริกซ์หรือตารางซึ่งประกอบด้วยแถวและคอลัมน์ มิติแรกของอาร์เรย์สองมิติคือแถวและมิติที่สองคือคอลัมน์ ในภาษาจาวาจำนวนคอลัมน์ของแต่ละแถวอาจไม่เท่ากันได้เรียกว่าอาร์เรย์ที่มีจำนวนแถวไม่เท่ากัน (ragged array) นอกจากนี้การดำเนินงานและการประมวลผลกับอาร์เรย์สองมิติสามารถทำงานร่วมกับการวนซ้ำแบบสองชั้นได้

ภาพที่ 6-3 ภาพเปรียบเทียบอาเรย์ 1 มิติกับอาร์เรย์ 2 มิติ

คะแนนสอบของนักเรียนในแต่ละครั้งซึ่งมีข้อมูล ดังตารางที่ 6-1 เป็นตัวอย่างหนึ่งของข้อมูลที่สามารถนำเอาอาร์เรย์ 2 มิติมาใช้ในการจัดเก็บได้

ตารางที่ 6-1 ตารางแสดงข้อมูลการสอบจำนวน 4 ครั้งของนักเรียน 3 คน

6.7 การสร้างและการใช้งานอาร์เรย์สองมิติ

ไวยากรณ์ในการประกาศและสร้างอาร์เรย์สองมิติ เป็นดังนี้

วิธีที่ 1 ประกาศแล้วสร้างอาร์เรย์

        ชนิดข้อมูล[][] ชื่ออาร์เรย์;
        ชื่ออาร์เรย์ = new ชนิดข้อมูล[จำนวนแถว][จำนวนคอลัมน์];

หรือ

        ชนิดข้อมูล ชื่ออาร์เรย์[][];
        ชื่ออาร์เรย์ = new ชนิดข้อมูล[จำนวนแถว][จำนวนคอลัมน์]; 

วิธีที่ 2 ประกาศพร้อมสร้างอาร์เรย์

    ชนิดข้อมูล[][] ชื่ออาร์เรย์ = new ชนิดข้อมูล[จำนวนแถว][จำนวนคอลัมน์];
    ชนิดข้อมูล ชื่ออาร์เรย์[][] = new ชนิดข้อมูล[จำนวนแถว][จำนวนคอลัมน์];

ตัวชี้ตำแหน่งของอาร์เรย์สองมิติจะต้องเป็นจำนวนเต็มโดยมิติแรกเป็นดัชนีแสดงตำแหน่งแถวและมิติที่สองแสดงเลขตำแหน่งคอลัมน์ หากต้องการกำหนดค่า 7 ให้กับอาร์เรย์สองมิติชื่อ matrix ในแถวที่ 2 และคอลัมน์ที่ 1 ทำได้ดังนี้ \(\text{matrix}[2][1] = 7\); ดังภาพที่ 6-4

ภาพที่ 6-4 ดัชนีของอาร์เรย์สองมิติ และการกำหนดค่าให้กับอาร์เรย์สองมิติ

เราสามารถกำหนดค่าเริ่มต้นให้กับอาร์เรย์สองมิติพร้อมกับการประกาศได้ ดังภาพอาร์เรย์ชื่อ array ในภาพที่ 6-4 คำสั่ง

int[] array = { {1, 2, 3}, 
  {4, 5, 6}, 
  {7, 8, 9}, 
  {10, 11, 12}};  

ผลการทำงานเทียบได้กับคำสั่งต่อไปนี้

    int[][] array = new int[3][4];
    array[0][0] = 1;  array[0][1] = 2; array[0][2] = 3;
    array[1][0] = 4;  array[1][1] = 5; array[1][2] = 6;
  array[2][0] = 7;  array[2][1] = 8; array[2][2] = 9;
    array[3][0] = 10;  array[3][1] = 11; array[3][2] = 12;

ตัวอย่างการกำหนดค่าให้กับอาร์เรย์สองมิติเป็นดังตัวอย่างที่ 6.12

ตัวอย่างที่ 6.12

คุณสมบัติของอาร์เรย์สองมิติ

อาร์เรย์สองมิติคืออาร์เรย์ซึ่งสมาชิกแต่ละตัวคืออาเรย์หนึ่งมิติอีกอาร์เรย์หนึ่ง ความยาวของอาร์เรย์ x คือจำนวนสมาชิกในอาร์เรย์หรือจำนวนแถวของอาร์เรย์สองมิติ จำนวนแถวของอาร์เรย์สองมิติของอาร์เรย์สามารถหาได้ดังนี้ x.length ความยาวของแต่ละแถวหรือจำนวนคอลัมน์ของอาร์เรย์สองมิติแต่ละแถวหรือความยาวของอาร์เรย์ x[0], x[0], …, x[length-1] ตามลำดับ สามารถหาได้ดังนี้ x[0].length, x[1].length, …, x[length-1].length

ตัวอย่างของอาเรย์สองมิติชื่อ x สมมุติให้ x = new int[3][4]; คืออาร์เรย์หนึ่งมิติจำนวน 3 อาร์เรย์ ได้แก่ x[0], x[1], และ x[0] ซึ่งอาร์เรย์แต่ละตัวประกอบไปด้วยสมาชิก 4 ช่อง ดังภาพที่ 6-5 x.length คือ 3 และ x[0].length, x[1].length, และ x[2].length มีค่าเท่ากับ 4

ภาพที่ 6-5 อาร์เรย์สองมิติคืออาร์เรย์หนึ่งมิติซึ่งสมาชิกแต่ละตัวคืออาร์เรย์หนึ่งมิติอีกอาร์เรย์หนึ่ง

จากแนวคิดข้างต้นจะเห็นได้จากตัวอย่างที่ 6.13 เราสามารถนำค่าในอาร์เรย์ไปใส่ในแถวใดแถวหนึ่งของอาร์เรย์สองมิติได้

ตัวอย่างที่ 6.11 ArrayEx11.java
public class ArrayEx13 {
        public static void main (String[] args) {
            int[][]array = new int[5][6];
            int[] x = {1, 2};
            array[0] = x;
            System.out.println("array [0][0] is " + array[0][0]);
            System.out.println("array [0][1] is " + array[0][1]);
        }
    }     
ผลการทำงานของโปรแกรม คือ

array [0][0] is 1

array [0][1] is 2

6.8 อาร์เรย์สองมิติที่มีความยาวในแต่ละแถวไม่เท่ากัน

ความยาวในแต่ละแถวของอาร์เรย์สองมิติสามารถไม่เท่ากันได้ซึ่งจะเรียกอาร์เรย์แบบนี้ว่า ragged array ตัวอย่างเช่น

int[][] matrix = {  {1, 2, 3, 4},
                          {2, 3, 4},
                          {3, 4},
                          {4}
                           };

ภาพที่ 6-6 อาร์เรย์สองมิติที่มีความยาวในแต่ละแถวไม่เท่ากัน

ตัวอย่างการนำไปใช้เช่นการจัดผังห้องสอบมีเลขที่นั่งดังภาพที่ 6-7

ภาพที่ 6-7 ผังการจัดเลขที่นั่งสอบ
ตัวอย่างที่ 6.14 โปรแกรม ArrayEx14.java
public class ArrayEx14 {
        public static void main (String args[]) {
                String ia[][] = {{“A1”, “A2”, “A3”}, 
                                           {“B1”, “B2”, “B3”, “B4”},
                                           {“C1”, “C2”, “C3”, “C4”, “C5”},
                                           {“D1”, “D2”, “D3”, “D4”},
                                             {“E1”, “E2”, “E3”}};
                for (int i = 0; i < ia.length; i++) {
                    for (int j = 0; j < ia[i].length; j++)
                            System.out.print(ia[i][j] + “\t”);
                    System.out.println();
                }  }  }
ผลการทำงานของโปรแกรม คือ

A1 A2 A3

B1 B2 B3 B4

C1 C2 C3 C4 C5

D1 D2 D3 D4

E1 E2 E3

การใช้งานอาร์เรย์สองมิติร่วมกับการวนซ้ำแบบหลายชั้น

การดำเนินการกับอาร์เรย์สองมิติทำได้ง่ายด้วยการใช้การวนซ้ำแบบหลายชั้นเป็นดังตัวอย่างต่อไปนี้

ตัวอย่างที่ 6.15 โปรแกรม ArrayEx15.java
import  java.util.Scanner;
    public class ArrayEx15 {
        public static void main(String[ ] args){
            Scanner sc = new Scanner(System.in);
            int  numRow  = 2, numColumn = 3;
            int[ ][ ]  numbers  =  new int[numRow][numColumn];
            int sum = 0;
            
            //Read all numbers
            System.out.println("Enter "+numbers.length+"x"+numbers[0].length+" matrix: ");
                for (int row = 0; row < numbers.length; row++) {
                for (int column = 0; colunm < numbers[row].length; column++) {  
                                numbers[row][column]  =  sc.nextInt();
                                sum = sum + numbers[row][column];     
                    }
            }   
                
            //Calculate the average
            double average = (double)sum/(numRow*numColumn);    
                
            //Display the result
                System.out.println("The array is ");
                for (int row = 0; row < numbers.length; row++) {
                for (int column = 0; column < numbers[row].length; column++)  { 
                        System.out.print(numbers[row][column] + "  ");
                }
                System.out.println();
                }
            System.out.println("The sum of numbers is " + sum);
            System.out.println("The average of numbers is " + average);
        }
    }
ตัวอย่างผลการทำงานของโปรแกรม คือ

Enter 2x3 matrix:

5 7 4

2 3 6

The array is

5 7 4

2 3 6

The sum of numbers is 27

The average of numbers is 4.5

จากตัวอย่างที่ 6.15 เป็นการรับค่ามาใส่ในอาร์เรย์ขนาด 2 แถว 3 คอลัมน์ทางแป้นพิมพ์มาใส่ในอาร์เรย์สองมิติชื่อ numbers แล้วทำการหาค่าผลรวม หาค่าเฉลี่ย และพิมพ์ข้อมูลในอาร์เรย์พร้อมทั้งผลรวมของตัวเลขและค่าเฉลี่ยออกทางจอภาพ

แบบฝึกหัด

  1. ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
    int n = 3;
    double x[] = new double[n];
    n++;
    System.out.println(x.length);
  1. ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
    int n = 3, m = 4;
    double[][] table = new double[n][m];
    n = n + 2;
    System.out.println(table.length);
  1. ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
    String[][] name = {
                    {“Ant”, “Apple”},
                    {“Bob”, “Bill”, “Beauty”},
                    {“Cat”, “Candle”, “Cook”, “Cute”},
                };
    System.out.println(name.length);
  1. ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
    int x = 10;
    int number[] = new int[10];
    for (int i = 0; i < number.length; i++) {
        number[i] = x-- + i;
        System.out.print(number[i] + "\t");
    }
  1. ให้ระบุผลลัพธ์ของโปรแกรมต่อไปนี้
    int num[][] = new int[5][5];
    for (int i = 0; i < num.length; i++) {
        for (int j = 0; j < num[i].length; j++) {
            num[i][j] = i * j;
            System.out.print(num[i][j] + “\t”);
        }
        System.out.println();
    }   
  1. ให้เขียนโปรแกรมเพื่อรับค่าคะแนนสอบของนักศึกษาจำนวน 3 คน จากการสอบทั้งหมด 4 ครั้ง ที่ป้อนทางแป้นพิมพ์มาเก็บในอาร์เรย์สองมิติโดยใช้การเขียนโปรแกรมแบบวนซ้ำ และหาค่าผลรวม (sum) ของคะแนนที่นักศึกษาแต่ละคนได้รับ แล้วพิมพ์ผลลัพธ์ออกทางจอภาพ ตัวอย่างการทำงานของโปรแกรมเป็นดังนี้

Enter student 1

Test 1: 9

Test 2: 7

Student 1’s total score is 16

Enter student 2

Test 1: 8

Test 2: 6

Student 2’s total score is 14

Enter student 3

Test 1: 4

Test 2: 7

Student 3’s total score is 11

Enter student 4

Test 1: 10

Test 2: 8

Student 4’s total score is 18

  1. ให้เขียนโปรแกรมเพื่อหาค่าผลบวกของเมตริกซ์ 2 เมตริกซ์ ซึ่งมีขนาด 2  3 (2 แถว 3 คอลัมน์) เช่น

\[ \left[\begin{array}{lll} 2 & 3 & 7 \\ 1 & 4 & 6 \end{array}\right]+\left[\begin{array}{lll} 4 & 2 & 8 \\ 5 & 3 & 2 \end{array}\right]=\left[\begin{array}{llc} 6 & 5 & 15 \\ 6 & 7 & 8 \end{array}\right] \]

ให้ใช้คำสั่งในการวนซ้ำเพื่อรับค่าข้อมูลเมตริกซ์ทั้ง 2 เมตริกซ์จากผู้ใช้ และหาผลบวก แล้วแสดงผลลัพธ์ออกทางจอภาพ

  1. เขียนโปรแกรมเพื่อสร้างอาร์เรย์สองมิติขนาด 3 x 4 และทำการสุ่มตัวเลขจำนวนเต็มตั้งแต่ 1 - 100 มาเก็บในอาร์เรย์นี้ โดยให้โปรแกรมแสดงผลการสุ่มอาร์เรย์ออกทางจอภาพพร้อมทั้งหาค่าสูงสุด ค่าต่ำสุด และค่าเฉลี่ยของตัวเลข

ตัวอย่างหน้าจอโปรแกรม

Random Array (3x4) :

19 87 1 74

88 57 52 87

94 34 67 83

Maximum number is 94

Minimum number is 1

Average number is 61.92

ลำดับขั้นตอนโปรแกรม
  1. ประกาศและสร้างอาร์เรย์สองมิติชื่อ number เป็นชนิด int ขนาด 3 x 4

  2. ประกาศตัวแปรผลรวม (total) ค่าเฉลี่ย (average) ค่าสูงสุด (max) และค่าต่ำสุด (min)

  3. ใช้การวนซ้ำเพื่อสุ่มค่าตั้งแต่ 1 – 100 เก็บในอาร์เรย์ 2 มิติที่ประกาศไว้ โดยใช้เมท็อดดังนี้

    (int)(Math.random() * 100 + 1)

ตัวอย่างการใช้งาน เช่น

number[i][j] = (int)(Math.random() * 100 + 1);

  1. แสดงค่าผลการสุ่มอาร์เรย์สองมิติโดยใช้วิธีการวนซ้ำ

  2. กำหนดค่าเริ่มต้นให้แก่ตัวแปร total, max และ min ดังนี้

total = 0;

max = number[0][0];

min = number[0][0];

  1. ใช้การวนซ้ำเพื่อเปรียบเทียบค่าในอาร์เรย์ number ทั้งหมดกับตัวแปร max และตัวแปร min เพื่อหาค่าที่สูงสุดและต่ำสุด พร้อมทั้งหาผลรวม (total)