JavaFX#6 Sequence

posted on 14 Jul 2009 21:11 by interviewz  in JavaFX

 

นอกเหนือจากประเภทข้อมูลพื้นฐานแล้ว JavaFX ยังมีโครงสร้างข้อมูลพิเศษ ทีเรียกว่า sequence ซึ่งแสดง order list ของ object แม้ว่าตัว sequence เองจะไม่ใช่ object

 

Object ที่อยู่ภายใน sequence เรียกว่า item และ sequence จะถูกประกาศด้วยเครื่องหมาย square brackets "[]" และแต่ละ item จะถูกแยกจากกันด้วยเครื่องหมายลูกน้ำ (comma)

 

 

 

 

 

 

Creating Sequences

วิธีเดียวที่จะสร้าง sequence คือการระบุรายการ item โดยแต่ละ item จะถูกแยกจากกันด้วยเครื่องหมายลูกน้ำ (comma)  และรายการจะถูกปิดด้วยเครื่องหมาย square brackets "[" and "]" ตัวอย่างดังโค๊ดด้านล่าง

 

def weekDays = ["Mon","Tue","Wed","Thu","Fri"];

 
ประกาศ sequence และกำหนดค่าให้กับ weekDays เราใช้ def ในตัวอย่างนี้เพราะเราไม่ได้วางแผนที่จะเปลี่ยนค่าของมันหลังจากที่สร้าง sequence นี้ขึ้นมาแล้ว ตอนนี้คอมไพเลอร์จะรู้ว่าเราตั้งใจประกาศ sequence ของ String เพราะแต่ละ item นั้นถูกประกาศด้วย String literial ในทางกลับกัน ถ้า sequence นั้นถูกประกาศด้วย integer (เช่น def nums = [1,2,3];) คอมไพเลอร์ก็จะรู้ว่าเราต้องการสร้าง sequence ของ interger

 

เราสามารถระบุประเภทของ sequence ได้ โดยแก้ไขการประกาศ เพื่อระบุชื่อประเภทไว้ใน "[ ]"

 

def weekDays: String[] = ["Mon","Tue","Wed","Thu","Fri"];

 
นี่จะเป็นการบอกคอมไพเลอร์ว่า weekDays จะเก็บ sequence ขอว String (ซึ่งไม่ใช่ String เพียงตัวเดียว).

Sequences สามารถถูกประกาศไว้ภายใน sequences อื่นได้

 

def days = [weekDays, ["Sat","Sun"]];

 
ในกรณีนี้ คอมไพเลอร์จะแปลง sequence ที่ซ้อนกัน เป็น sequence เดียว แบบข้างล่างนี้

 

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

 
และนี่คือวิธีลัดที่ทำให้สร้าง sequence ที่มีรูปแบบเป็นชุดของตัวเลขได้ง่ายขึ้น ในการสร้าง sequence ที่ประกอบไปด้วยเลข 1 ถึง 100 นั้น สามารถประกาศได้ดังนี้

 

def nums = [1..100];

 

 

 

Real-World Example: Display Shelf (Sequence Example #1)

 

 

 

ภาพตัวอย่างด้านบนแสดงให้เห็นโปรแกรม Display Shelf โค๊ดด้านขวา แสดง instance variable (ชื่อว่า “content”) ซึ่งเป็นของ Group object ตัวแปรนี้มี sequence ซึ่งถูก initialized ด้วย 2 item (ที่เน้นสีเหลืองตรง ImageView object และ Rectangle object) เราสามารถดู sequence ที่มีอยู่ได้โดยการมองหา square brackets เปิดและปิด (ถูกเน้นด้วยสีเหลืองเช่นกัน) item ของ sequence จะถูกกำหนดขอบเขตด้วย comma ซึ่งนั้นคือเหตุผลที่ทำไมมี “,” ปรากฏอยู่ระหว่าง ImageView object และ Rectangle object

 

 

 

 

 

 

 

 

 

Using Predicates

เราสามารถใช้ a boolean expression (หรือที่เรียกว่า predicate) ในการประกาศ sequence ใหม่ ซึ่งเป็น subset ของ sequence เดิมที่มีอยู่แล้ว  ตัวอย่าง ลองพิจารณาโค๊ดด้านล่างนี้

def nums = [1,2,3,4,5];

 ในการสร้าง sequence ที่สอง ซึ่งมีพื้นฐานมาจาก item ใน sequence แรก แต่มีแค่เลขที่มากกว่าเลข 2 สามารถเขียนได้ดังนี้

def numsGreaterThanTwo = nums[n | n > 2];

เราสามารถแสดงบรรทัดที่แล้วของโค๊ดเป็นภาษาไทยได้ดังนี้

เลือก item จาก sequence ชื่อ num โดยเลือกเฉพาะค่าของ item ที่มีค่ามากกว่า 2 และกำหนด item เหล่านั้นไว้ใน sequence ใหม่ที่มีชื่อเรียกว่า numGreaterThanTwo”  คำที่เป็นตัวหนานั้นคือ predicate

ในโค๊ดนี้

1. sequence ที่พึ่งถูกสร้างจะถูกเก็บใน numsGreaterThanTwo.

2. โค๊ดที่เป็นตัวหนา  nums[n | n > 2]; ระบุ sequence เดิมที่จะถูก copy ค่าของ item จากตัวอย่าง nums คือชื่อของ sequence เดิม

3. เลือก items จาก nums และ return ไปให้ sequence ใหม่ ซึ่งมี item เป็นจริงตาม predicate เป็นจริง

4. อักษร "|" ถูกใช้เพื่อแบ่งให้เห็นตัวแปร “n” แยกออกจากโค๊ดส่วนที่เหลือ nums[n | n > 2];

5. โค๊ดที่เป็นตัวหนา nums[n | n > 2]; กำหนด boolean expression ระบุเกณฑ์ที่ item ปัจจุบันจะถูก copy ไปให้ sequence ใหม่


 

 

 

การเข้าถึง item ของ sequence

(Accessing Sequence Items)

 

Item ของ Sequence จะถูกเข้าถึงด้วย เลข index ซึ่งเริ่มต้นที่ 0 ในการเข้าถึงแต่ละ item นั้น ให้พิมพ์ชื่อของ sequence ตามด้วย index ซึ่งอยู่ภายในเครื่องหมาย square bracket

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

 

println(days[0]);

println(days[1]);

println(days[2]);

println(days[3]);

println(days[4]);

println(days[5]);

println(days[6]);

 

จะได้ผลลัพธ์ดังด้านล่าง

 

Mon

Tue

Wed

Thu

Fri

Sat

Sun

 

นอกจากนี้เรายังสามารถกำหนดขนาดของ sequence ได้โดยใช้ sizeof แล้วตามด้วยชื่อของ sequence

sizeof days


 

โค๊ดด้านล่าง พิมพ์ "7" ออกมาบนหน้าจอ

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

println(sizeof days);

 

 

 
 
 
 

การเพิ่ม item เข้าไปใน sequence

(Inserting Items into a Sequence)

เราจะใช้คีย์เวิร์ดว่า insert ในการเพิ่ม item เข้าไปใน sequence, before a specific item, or after a specific item.

 

เราลองมาสร้าง sequence ที่ชื่อว่า days กันใหม่อีกครั้ง สังเกตว่าคราวนี้เราประกาศตัวแปร days โดยใช้ var เพราะเราจะเปลี่ยนค่าของมันหลังจาก sequence เดิมถูกสร้าง

var days = ["Mon"];

 
ตอนนี้ sequence จะมีเพียงแค่ item เดียว นั่นคือ “Mon”

เราสามารถเพิ่ม “Thu” เข้าไปในส่วนท้ายของ sequence โดยใช้คีย์เวิร์ดว่า insert และคีย์เวิร์ด into

insert "Tue" into days;

 

เราอาจจะเพิ่ม “Fri” , “Sat” , “Sun” เข้าไปได้ด้วยวิธีเดียวกัน

insert "Fri" into days;

insert "Sat" into days;

insert "Sun" into days;

 
ตอนนี้ sequence จะประกอบไปด้วย: "Mon", "Tue", "Fri", "Sat", and "Sun"

เราสามารถใช้คีย์เวิร์ด insert กับคีย์เวิร์ด before ในการเพิ่ม item เข้าไปในตำแหน่งก่อนหน้า index ที่เราระบุ อย่าลืมว่า index นั้นเริ่มต้นที่ 0 ดังนั้นใน sequence ของเราต้องนี้ “Fri” อยู่ที่ index เป็น 2 ดังนั้น เราสามารถเพิ่ม “Thu” เข้าไปก่อนหน้า “Fri” ได้ดังนี้

insert "Thu" before days[2];

 

ตอนนี้ sequence ประกอบไปด้วย: "Mon", "Tue", "Thu", "Fri", "Sat" และ "Sun"

ในการเพิ่ม “Wed” เข้าไปอยู่หลัง “Thu” เราสามารถใช้คีย์เวิร์ด insert กับคีย์เวิร์ด after

insert "wed" after days[1];

 

ตอนนี้ sequence ประกอบไปด้วยทุกวันใน 1 สัปดาห์ : "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", and "Sun".

 

 

 

 

การลบ item ออกจาก sequence

(Deleting Items from a Sequence)

คีย์เวิร์ด delete และคีย์เวิร์ด from ทำให้ง่ายต่อการลบ item ออกจาก sequence

delete "Sun" from days;

 
ตอนนี้ sequence ประกอบไปด้วย:"Mon", "Tue", "Wed", "Thu", "Fri", and "Sat".

เราสามารถลบ item โดยการระบุตำแหน่ง index ได่นเดียวกัน โค๊ดด้านล่างทำการลบ “Mon” ออกจาก sequence (อย่าลืมว่า “Mon” เป็น item แรก ดังนั้น index ของมันคือ 0)

delete days[0];

 
ในการลบ item ทั้งหมดออกจาก sequence ให้ใช้คีย์เวิร์ด delete ตามด้วยชื่อของ sequence

delete days;

 
อย่าลืมว่า delete นั้นจะลบแค่ item ออกจาก sequence เท่านั้น มันไม่ได้ลบตัวแปร days ออกจาก script ของเรา เราจะยังเข้าถึงตัวแปร days ได้ และเพิ่ม item อื่นเข้าไปได้เช่นกัน

 

 

 

 

การกลับ item ใน sequence

(Reversing the Items in a Sequence)

เราสามารถกลับลำดับของ item ใน sequence ได้ง่ายๆ โดยใช้คีย์เวิร์ด reverse

var nums = [1..5];

reverse nums; // returns [5, 4, 3, 2, 1]

 

 

 

 

การเปรียบเทียบ sequence

(Comparing Sequences)

บางครั้งเราอาจจะต้องการเปรียบเทียบ sequence ว่าเท่ากันหรือไม่ โดยการเปรียบเทียบของ sequence นั้น ใช้วิธีการเปรียบเทียบโดย value ถ้าความยาวเท่ากันและ item เหมือนกัน sequence นั้นจะเท่ากัน

ทดสอบโดยสร้าง sequence ขึ้นมา 2 อัน ซึ่งเหมือนกันทุกอย่าง

def seq1 = [1,2,3,4,5];

def seq2 = [1,2,3,4,5];

println(seq1 == seq2);

 

ใน expression seq1 == seq2 นั้นจะได้ค่า true เพราะทั้งสอง sequencesมีจำนวน item เท่ากัน และค่าของแต่ละ item นั้นเหมือนกันทั้งสอง sequence โค๊ดด้านบนจึงพิมพ์คำว่า “true” บนหน้าจอ

ถ้าเพิ่มตัวเลขของ items เข้าไปใน sequence อันใดอันหนึ่ง ตอนนั้น sequences จะมีความยาวไม่เท่ากัน:

def seq1 = [1,2,3,4,5];

def seq2 = [1,2,3,4,5,6];

println(seq1 == seq2);

 
ตอนนี้ผลลัพธ์จะกลายเป็น “false” เพราะ sequence ที่สองมีความยาวมากกว่า sequence แรก จึงทำให้มันไม่เท่ากัน

เรายังสามารถทำให้ทั้ง 2 sequences ไม่เท่ากันได้อีก โดยเปลี่ยนค่าของ item แม้ว่าความยาวของทั้ง 2 sequence จะยังเท่ากัน ดังนี้

def seq1 = [1,2,3,4,5];

def seq2 = [1,3,2,4,5];

println(seq1 == seq2);

 
ผลลัพธ์ของโค๊ดนี้จะได้ “false” เพราะทั้งสอง sequence นั้นไม่เท่ากัน

 

 

 
 

Using Sequence Slices

seq[a..b]

syntax นี้ เราสามารถเข้าถึง item ได้ระหว่าง index a ถึง index b

ส่วนโค๊ดด้านล่างนี้ สร้าง sequence ชื่อ weekend ซึ่งมี item เพียงแค่ “Sat” และ “Sun”

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

def weekend = days[5..6];

 

seq[a..

ใช้อักษร "<" ในการเข้าถึง items ซึ่งอยู่ระหว่าง index a จนถึง index b เราสามารถใช้ เพื่อสร้าง sequence ชื่อ weekdays ประกอบไปด้วย item ของ days ตั้งแต่ "Mon" ไปจนถึง "Fri"

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

def weekdays = days[0..<5];

 

seq[a..]

เราสามารถเข้าถึงทุก item นับตั้งแต่ index a ไปจนถึง item ตัวสุดท้ายใน sequenceด้วยการละเว้น index ตัวที่สอง จากตัวอย่างเดิม เราสร้าง weekend ได้ดังโค๊ดด้านล่าง

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

def weekend = days[5..];

 

seq[a..<]

สุดท้าย เราใช้ “<” โดยไม่ต้องมี index ตัวที่สอง เพื่อเข้าถึงทุก item ตั้งแต่ index a ไปจนสิ้นสุด sequence ยกเว้น  item สุดท้าย

def days = ["Mon","Tue","Wed","Thu","Fri","Sat","Sun"];

def days2 = days[0..<];

 
โค๊ดด้านบนจะสร้าง days2 ซึ่งประกอบด้วย item ตั้งแต่ “Mon” จนถึง “Sat”

 

Real-World Example: Display Shelf (Sequence Example #2)

 

 

 

โค๊ดนี้มากจากโปรแกรม "Display Shelf" แสดงการใช้  slices แบ่งออกเป็น 2 ส่วน

 slices นี้ประกาศให้อยู่ในช่วง "0 .. half-2" และ "half..content.size()-1", ในการที่จะดู sequence slice ให้มองหา  ".."  ที่อยู่ภายในเครื่องหมาย square brackets

 

 
 
 
 

CREDIT : ภาคภาษาอังกฤษดั้งเดิม http://java.sun.com

ไปดูตัวอย่างอื่นเพิ่มเติมได้ที่ http://java.sun.com/javafx/1/tutorials/core/sequences/
 
 
 
 

 

Comment



smilebig smileopen-mounthed smileconfused smilesad smileangry smiletonguequestionembarrassedsurprised smilewinkdouble winkcry

Tweet