สิ่งที่น่าสนใจสำหรับ List

สิ่งที่น่าสนใจสำหรับ List

1. Collections.sort( )

เราสามารถเรียงค่าที่อยู่ใน List ให้เป็นไปตามต้องการ เช่น เรียงจากมากไปน้อย เรียงตามขนาดของตัวแปร size หรือเรียงตามสีของวัตถุวงกลม เป็นต้น การเรียงจะใช้ static method ที่ชื่อว่า sort ของคลาส Collections

มีรูปแบบดังนี้คือ     Collections.sort(ชื่อ List , วัตถุหรือ reference ของคลาสที่บอกวิธีการเรียง)

 

เงื่อนไขก่อนการ sort คือเราต้องสร้างคลาสที่บอกวิธีการเรียงวัตถุก่อน ซึ่งจาวากำหนดให้เราสร้างโดย implement มาจาก interface Comparator โดย interface นี้เราต้องทำการ override เมธอดที่ชื่อว่า compare โดย return type ของเมธอดนี้จะเป็นตัวบอกลำดับของวัตถุ

  • return ออกมาเป็นค่าลบ หมายความว่าวัตถุแรกอยู่หลังวัตถุที่สอง (object one < object two)
  • return ออกมาเป็นศูนย์ หมายความว่าวัตถุแรกเท่ากับวัตถุที่สอง (object one = object two)
  • return ออกมาเป็นค่าบวก หมายความว่าวัตถุแรกอยู่ก่อนวัตถุที่สอง (object one > object two)

ตัวอย่าง

public class PositionXSort implements Comparator<Circle>{

   

    public int compare(Circle one,Circle two)

    {

        if(one.getX()==two.getX())

        return 0;

        else if(one.getX()>two.getX())

            return 1;

        else

            return -1;

        }

}

 

จากตัวอย่างในที่นี้คลาส PositionXSort จะบอกวิธีการเรียงวัตถุของคลาส Circle โดยเรียงตามตำแหน่งแกน X

ตัวอย่างวิธีใช้คลาส PositionXSort แสดงได้ดังโค้ดด้านล่าง (ให้ Constructor ของ Circle กำหนดตำแหน่ง x, y ตามลำดับ)

 

List<Circle> list = new ArrayList<Circle>();     

        list.add(new Circle(100,30));

        list.add(new Circle(50,30));

        list.add(new Circle(200,20));

        Collections.sort(list,new PositionSort());

Circle(50,30) , Circle(100,30) , Circle(200,20)

 

 

 

 

2. Collections.binarySearch( )

เราสามารถค้นหาสิ่งที่อยู่ใน List ได้โดยใช้ static method ชื่อ binarySearch ของคลาส Collection โดยมีเงื่อนไขเพียงทำการเรียงข้อมูลด้วย Collection.sort( ) ก่อนเท่านั้น

ตัวอย่างเช่นเมื่อเราเรียงวัตถุของคลาส Circle ตามตัวอย่างที่ผ่านมาแล้วก็สามารถค้นหาตำแหน่งของวัตถุได้

 

int i = Collections.binarySearch(list,new Circle(100,30),new PositionSort());

ได้ค่า 1 ออกมาเนื่องจากอยู่ในตำแหน่งที่ 1

หากไม่พบวัตถุนั้นจะให้ค่าที่เป็นเลขลบออกมา

 

System.out.println(i);

 

3. ArrayList< >.contain( )

หากต้องการเพียงตรวจสอบว่ามีวัตถุที่ต้องการอยู่ใน List หรือไม่ ทำได้โดยใช้เมธอด Contain( ) ได้โดยตรง ซึ่งเมธอดนี้เราไม่ต้องสร้าง มีอยู่แล้วใน ArrayList< >

แต่มีข้อแม้คือ เราต้องทำการ override method ที่ชื่อ public boolean equals(Object o) ของคลาสที่จะค้นหาก่อน

ซึ่งเมธอดนี้เป็นของคลาส Object ที่เป็นวัตถุบรรพบุรษของทุกคลาสนั้นเอง ในที่นี้จะยกตัวอย่างเดิมคือแก้ไขที่คลาส Circle

 

public boolean equals(Object o)

{

         if(o instanceof Circle)

            return ( ((Circle)o).getX()==(this.xPosition) ) && ( ((Circle)o).getY()==(this.yPosition) ) ;

         else

             return false;

}

 

จากตัวอย่างคีย์เวิร์ด instanceof เป็นการตรวจสอบว่าวัตถุที่เรฟเฟอร์เรนซ์ o ชี้ไปเป็นของคลาส Circle จริง

จากนั้นตรวจสอบว่าค่า x และ y ของวัตถุ 2 ชนิดเท่ากันหรือไม่ ถ้าเท่ากันส่งค่า true กลับ ถ้าไม่เท่าส่งค่า false

ตัวอย่างวิธีค้นหาวัตถุใน List โดยใช้เมธอด Contain( ) คือ

 

List<Circle> list = new ArrayList<Circle>();     

        list.add(new Circle(100,30));

        list.add(new Circle(50,30));

        list.add(new Circle(200,20));

  System.out.println(list.contains(new Circle(100,30)));

 

ได้ค่า true เนื่องจากมีวัตถุที่มีมีตำแหน่ง x=100,y=30 อยู่ใน List

 

 

 

 

ตัวอย่างเมธอดอื่น ๆ ในอินเตอร์เฟซ List ที่สืบทอดมาจาก Collection เช่น

void add(int index,E element)      แทรกสมาชิกเข้าไปใน List

E remove(int index)                    เอาสมาชิกออกจาก List

E set(int index,E element)           ใส่วัตถุลงใน List โดยแทนที่วัตถุเดิม

E get(int index)                          ขอ reference ของวัตถุใน List ตรงตำแหน่งที่ต้องการ

 

 

 
อ้างอิงจาก  เอกสารประกอบการเรียน วิชา Modern Programming

กรุณา Comment สักหน่อยเถอะ จะได้ปรับปรุ่งให้ดีขึ้น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s