Collections

11 February 2017

Collection คือออบเจ็คที่สามารถเก็บข้อมูลของออบเจ็คอื่นในตัวมันได้แบบไดนามิกส์ และเป็นเครื่องมืออำนวยความสะดวกที่จะช่วยให้โปรแกรมเมอร์เขียนโปรแกรมได้รวดเร็วและมีประสิทธิกว่า ในภาษา Java นั้นมี Collection มากมายที่คุณสามารถใช้ในการเขียนโปรแกรมซึ่ง Collection ถูก Implement มาจาก Interfaces Collection ซึ่งเป็นไลบรารี่ของภาษาที่อยู่ใน Package java.util และใน Collection ส่วนมากนั้นสืบทอดมาจาก Abstract class และมีการ Implement บาง Interfaces รวมกัน

Collection นั้นเป็นการเก็บข้อมูลแบบไดนามิกส์ นั่นหมายความว่าคุณสามารถเพิ่มข้อมูลเข้าไปใน Collection ได้ไม่จำกัด โดยที่ไม่ต้องกำหนดขนาดสูงสุดในการเก็บข้อมูลล่วงหน้า Collection มีเมธอดที่ทำงานด้วยอัลกอรึมทึมที่มีประสิทธิภาพเป็นจำนวนมากให้คุณสามารถใช้งานได้ทันที โดยที่ไม่ต้องเขียนขึ้นอีก ยกตัวอย่างเช่น การเรียงข้อมูลภายใน Collection เป็นต้น Collection นั้นเป็น Generic type ซึ่งมีรูปแบบเป็น G<T> ในบทนี้ เราจะแนะนำให้คุณรู้จักกับ Collection ในภาษา Java เบื้องต้น ดังนี้

  • การใช้ Array list ในภาษา Java
  • การใช้ Map ในภาษา Java
  • การใช้ Stack ในภาษา Java

การใช้ Array list ในภาษา Java

Array list คือ Collection ที่ใช้เก็บข้อมูลเหมือนอาเรย์ปกติ แต่สิ่งที่แตกต่างกันคือ Array list สามารถย่อและขยายของมันได้อัตโนมัติตามข้อมูลที่มีอยู่ภายใน นั่นเองทำให้มันยืดหยุ่นในการทำงานเพราะไม่ต้องกำหนดขนาดสูงสุดล่วงหน้าเหมือนกับอาเรย์ปกติ มันถูกสืบทอดมาจาก Abstract list คลาส และมีการ Implement Collection Interfaces สำหรับเมธอดการทำงานของมัน ต่อไปเป็นตัวอย่างการใช้งาน Array list ในภาษา Java

import java.util.ArrayList;

public class ArrayListExample {

    public static void main (String[] args) {

        ArrayList<String> names = new ArrayList<String>();
        names.add("Mateo");
        names.add("Danny");
        names.add("Joe");
        names.add("Alex");

        System.out.println(names.size() + " people in the list");

        // Access list through  it index
        System.out.println("name[0] = " + names.get(0));
        System.out.println("name[3] = " + names.get(3));

        // Iterate through ArrayList usign foreach
        for (String name: names) {
            System.out.print(name + " ");
        }
        System.out.println();

        // Iterate through ArrayList using index (reverse)
        for (int i = names.size() - 1; i >= 0; i--) {
            System.out.print(names.get(i) + " ");
        }
        System.out.println();

        // Check if the list contain Mateo
        if (names.contains("Mateo")) {
            System.out.println("Mateo is in the list");
        } else {
            System.out.println("Mateo is not in the list");
        }

        // Get Danny's index
        int dannyIndex = names.indexOf("Danny");
        System.out.println("Index of Danny is " + dannyIndex); 
        // Change Danny to Max
        names.set(dannyIndex, "Max");

        // Remove joe from the list
        names.remove("Joe");

        // Iterate through ArrayList usign foreach
        for (String name: names) {
            System.out.print(name + " ");
        }
        System.out.println();

        // Clear all list data
        names.clear();

        if(names.isEmpty()) {
            System.out.println("List is now empty");
        }

    }

}

ในตัวอย่าง เป็นโปรแกรมในการใช้ Array list สำหรับเก็บชื่อของผู้ใช้ หลังจากนั้นเราจะใช้ Iterator ในการวนอ่านข้อมูลจากอาเรย์ และการใช้งานเมธอดต่างๆ ของ Array list ในการที่จะใช้ Array list ในภาษา Java นั้นเราต้องทำการ import java.util.ArrayList ไลบรารี่

ArrayList<String> names = new ArrayList<String>();

นี่เป็นคำสั่งในการประกาศอาเรย์ลิสต์จากคลาส ArrayList และในภายในเครื่องหมาย <String&gt นั้นหมายถึง Array list นี้จะใช้สำหรับเก็บของออบเจ็ค String นั่นหมายความว่ามันสามารถเก็บออบเจ็คอื่นก็ได้ โดยการกำหนดคลาสของออบเจ็คในเครือ่งหมาย <&gt

names.add("Mateo");
names.add("Danny");
names.add("Joe");
names.add("Alex");

หลังจากนั้นเราเพิ่ม 4 ชื่อลงไปใน Array list ด้วยเมธอด add() ข้อมูลที่เพิ่มลงไปนั้นต้องเป็น String เพราะว่าเราได้กำหนด Array list สำหรับเก็บข้อมูล String ในตอนประกาศ

System.out.println(names.size() + " people in the list");

// Access list through  it index
System.out.println("name[0] = " + names.get(0));
System.out.println("name[3] = " + names.get(3));

Collection ส่วนมากมีเมธอด size() สำหรับนับจำนวนสมาชิกของมัน เราได้ใช้เมธอดดังกล่าวในการนับข้อมูลของ Array list และเราเข้าถึงข้อมูลของ Array list ด้วยเมธอด get() โดยใส่ Index เป็นพารามิเตอร์ ซึ่ง Index ของ Array list นั้นจะเหมือนกับอาเรย์ปกติคือข้อมูลที่เพิ่มเข้าอันแรกจะมี Index เริ่มจาก 0 และเพิ่มไปทีละ 1

// Get Danny's index
int dannyIndex = names.indexOf("Danny");
System.out.println("Index of Danny is " + dannyIndex); 
// Change Danny to Max
names.set(dannyIndex, "Max");

เมธอด indexOf() ใช้รับค่าของ Index ของข้อมูลที่ต้องการในอาเรย์ ในตัวอย่างเราหา Index ของ "Danny" หลังจากนั้นเราเปลี่ยนค่าที่ Index ดังกล่าวด้วยเมธอด set() ในคำสั่งเหล่านี้จึงเป็นการเปลี่ยนข้อมูลในอาเรย์จาก "Danny" เป็น "Max"

// Remove joe from the list
names.remove("Joe");

เมธอด remove() เป็นการนำข้อมูลออกจากอาเรย์ ในตัวอย่างเป็นการลบ "Joe" ออกจากอาเรย์ ผลลัพธ์ของการลบก็คือ Index ภายในอาเรย์หลังจากตำแหน่งที่ถูกลบจะเลื่อนลงมาหนึ่ง คุณสามารถลบใส่พารามิเตอร์เป็น Index ได้ เช่น names.remove(2) นั้นให้ผลลัพธ์เช่นเดียวกันกับคำสั่งด้านบน

เมธอด clear() ใช้สำหรับลบข้อมูลทั้งหมดออกจากอาเรย์ และเมธอด isEmpty() เพื่อตรวจสอบว่า Collection นั้นว่างหรือมีข้อมูลหรือไม่

4 people in the list
name[0] = Mateo
name[3] = Alex
Mateo Danny Joe Alex 
Alex Joe Danny Mateo 
Mateo is in the list
Index of Danny is 1
Mateo Max Alex 
List is now empty

นี่เป็นผลลัพธ์ของโปรแกรมในการใช้งาน Array list ในภาษา Java

การใช้ Maps ในภาษา Java

Maps เป็น Collection ที่มีรูปแบบในการเก็บข้อมูลเป็นแบบ Key Value และเป็นคลาสที่ Implement มาจาก java.util.Map Interface ในภาษา Java นั้นมี Map หลายประเภท แต่ที่ใช้บ่อยๆ คือ HashMap และ TreeMap โดยที่ HashMap จะเก็บข้อมูลโดยไม่มีการเรียงของ Key และ Value ส่วน TreeMap จะมีการเรียงข้อมูลภายใน ทำให้การเข้าถึงข้อมูลภายใน Map จะเร็วกว่า ในทางกลับกัน HashMap นั้นการเพิ่มข้อมูลจะเร็วกว่า ต่อไปเป็นตัวอย่างในการใช้ Map ในภาษา Java

import java.util.HashMap;

public class HashMapExample {

    public static void main (String[] args) {

       HashMap<String, String> country = new HashMap<>();
       country.put("de", "German");
       country.put("th", "Thailand");
       country.put("us", "United State");
       country.put("tr", "Turkey");

       System.out.println("Map size = " + country.size());

       System.out.println("de = " + country.get("de"));
       System.out.println("th = " + country.get("th"));
       System.out.println("th = " + country.get("uk"));

       System.out.println("Iterate over each Entry in HashMap");
       for (HashMap.Entry<String, String> entry : country.entrySet())
       {
           System.out.println(entry.getKey() + " = " + entry.getValue());
       }

       country.remove("tr");
       if(country.containsKey("tr")) {
           System.out.println("Turkey exist in the map");
       } else {
           System.out.println("Turkey does not exist in the map");
       }

       country.clear();
       System.out.println("Map size = " + country.size());

    }
}

ในตัวอย่าง เป็นการใช้งาน Map ในการเก็บข้อมูลของประเทศ โดยมีชื่อย่อของโดเมนเป็น Key และชื่อประเทศเป็น Value หลังจากนั้นสร้างออบเจ็คด้วยคลาส HashMap และใช้ Iterator สำหรับวนอ่านค่า Key Value ภายใน Map และแสดงข้อมูลภายใน Map และใช้เมธอดที่สำคัญของมัน

HashMap<String, String> country = new HashMap<>();

นี่เป็นคำสั่งในการประกาศ Map โดยใช้คลาส HashMap สำหรับเก็บข้อมูลของประเทศ ทั้ง Key และ Value ของ Map นี้เป็นประเภทข้อมูลแบบ String

country.put("de", "German");
country.put("th", "Thailand");
country.put("us", "United State");
country.put("tr", "Turkey");

เราเพิ่มข้อมูลลงไปใน Map ด้วยเมธอด put() ซึ่งพารามิเตอร์ของเมธอดนั้นเป็น Key และ Value ตามลำดับ เราได้เพิ่ม 4 ประเทศลงไปใน HashMap ของเรา

System.out.println("de = " + country.get("de"));
System.out.println("th = " + country.get("th"));
System.out.println("th = " + country.get("uk"));

เมธอด get() เป็นเมธอดสำหรับรับค่าของออบเจ็คภายใน Map โดยมี Key ของออบเจ็คเป็นพารามิเตอร์ ในตัวอย่าง เราได้เข้าเข้าถึงค่า "German" "Thailand" และ "Turkey" ตามลำดับ

System.out.println("Iterate over each Entry in HashMap");
for (HashMap.Entry<String, String> entry : country.entrySet())
{
    System.out.println(entry.getKey() + " = " + entry.getValue());
}

นี่เป็นการวนอ่านค่า Key Value ภายใน Map โดยการใช้ HashMap.Entry Iterator ที่ใช้สำหรับทำงานกับ Map ประเภทต่าง และแสดงผล Key และ Value ออกทางหน้าจอ

country.remove("tr");
if(country.containsKey("tr")) {
    System.out.println("Turkey exist in the map");
} else {
    System.out.println("Turkey does not exist in the map");
}

เมธอด remove() เป็นเมธอดในการนำออบเจ็คของ Key ที่ระบุออกจาก Map และเมธอด containsKey() ใช้เพื่อตรวจสอบว่ามี Key ดังกล่าวอยู่ใน Map หรือไม่ หรือคุณสามารถตรวจสอบโดย Value ได้โดยการใช้เมธอด containsValue()

Iterate over each Entry in HashMap
de = German
th = Thailand
us = United State
tr = Turkey
Turkey does not exist in the map
Map size = 0

นี่เป็นผลลัพธ์การทำงานของโปรแกรมสำหรับการใช้งาน Map ในภาษา Java คุณจะเห็นว่าเราไม่ได้อธิบายสำหรับบางเมธอด เพราะว่ามันมีการทำงานที่เหมือนกันกับ Array list เช่น เมธอด size() สำหรับหาขนาด หรือเมธอด clear() สำหรับลบข้อมูลทั้งหมดออกจาก Map

การใช้ Stack ในภาษา Java

Stack คือโครงสร้างข้อมูลที่ใช้ในการเก็บข้อมูลในรูปแบบ First in last out (FILO) ข้อมูลที่ถูกใส่เข้าไปใส Stack เป็นอันแรกนั้นจะนำออกได้ทีหลัง นั้นคือเราสามารถนำเข้ามูลเข้าออกได้ทางเดียว ในการทำงานกับ Stack เมื่อเราข้อมูลใส่ลงไปใน Stack จะเรียกว่า Push และเมื่อนำข้อมูลออกมาจาก Stack เรียกว่า Pop เราสามารถจัดการกับข้อมูลที่อยู่ด้านบนสุดของ Stack ได้เท่านั้น

Image on Marcuscode

Stack ถูกนำไปใช้มากมายในการเขียนโปรแกรมในระบบปฏิบัติการ ตัวอย่างของการใช้งานของ Stack เช่น การเรียกใช้งานฟังก์ชัน ที่จะมีการเก็บฟังก์ชันที่ถูกเรียกลงใน Stack และเพื่อทำงานในฟังก์ชันนั้นเสร็จแล้ว จะนำออกจาก Stack เป็นต้น ในบทนี้ จะเป็นตัวอย่างการใช้งาน Stack เพื่อเก็บข้อมูลในเบื้องต้น ในภาษา Java

import java.util.Stack;

public class StackExample {

    public static void main (String[] args) {

        Stack<String> fruit = new Stack<>();

        // Add four fruits to stack
        fruit.push("Apple");
        fruit.push("Banana");
        fruit.push("Melon");
        fruit.push("Peach");

        System.out.println("Pop " + fruit.pop() + " from stack");
        System.out.println("Pop " + fruit.pop() + " from stack");
        System.out.println("Pop " + fruit.pop() + " from stack");
        System.out.println("Pop " + fruit.pop() + " from stack");

        if (fruit.isEmpty()) {
            System.out.println("Stack is empty");
        }

    }
}

ในตัวอย่าง เป็นการใช้งาน Stack ในการเก็บชื่อของผลไม้ เราประกาศตัวแปร fruit จากคลาส Stack และกำหนดน Generic type เป็น String เมธอด push() ใช้สำหรับเพิ่มข้อมูลลงไปใน Stack เราได้เพิ่มชื่อผลไม้ 4 ชนิดลงไปข้อมูลล่าสุดใน Stack จึงเป็น "Peach" เมธอด pop() นั้นเป็นการนำข้อมูลล่าสุดใน Stack ออกมา

Pop Peach from stack
Pop Melon from stack
Pop Banana from stack
Pop Apple from stack
Stack is empty

นี่เป็นผลลัพธืการทำงานของโปรแกรมของการใช้งาน Stack ในภาษา Java

ในบทนี้ คุณได้รู้จักกับ Collection และตัวอย่างการใช้งาน Collection ประเภทต่างๆ ในภาษา Java ซึ่ง Collection แต่ละประเภทนั้นเป็นโครงสร้างข้อมูลที่ออกแบบมาสำหรับการจัดเก็บข้อมูลในสถานการณ์ต่างๆ ของการเขียนโปรแกรม Collection นั้นมีบางเมธอดที่เหมือนกัน เช่น เมธอด size() สำหรับนับจำนวนทั้งหมด เป็นต้น เพราะว่าพวกมันสืบทอดมาจากคลาสหลักเดียวกัน

บทความนี้เป็นประโยชน์หรือไม่?Yes·No