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)
วิธีเดียวที่จะสร้าง 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 จะถูกเข้าถึงด้วย เลข 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] |
(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