1. อาร์เรย์สองมิติ
อีกหนึ่งข้อเท็จจริงที่น่าสนใจเกี่ยวกับอาร์เรย์ อาร์เรย์ไม่ได้มีเพียงมิติเดียว (เชิงเส้น) นอกจากนี้ยังสามารถเป็นสองมิติ
คุณถามหมายความว่าอย่างไร
ซึ่งหมายความว่าเซลล์ของอาร์เรย์สามารถแสดงได้ไม่เพียงแค่คอลัมน์ (หรือแถว) แต่ยังรวมถึงตารางสี่เหลี่ยมด้วย
int[][] name = new int[width][height];
โดยที่nameคือชื่อของตัวแปรอาร์เรย์ความกว้างคือความกว้างของตาราง (ในเซลล์) และความสูงคือความสูงของตาราง ตัวอย่าง:
|
เราสร้างอาร์เรย์สองมิติ: 2 คอลัมน์และ 5 แถว เขียน 5 ลงในเซลล์ (1, 1) |
นี่คือลักษณะที่ปรากฏในหน่วยความจำ:
นอกจากนี้ คุณยังสามารถใช้การเริ่มต้นอย่างรวดเร็วสำหรับอาร์เรย์สองมิติ:
// Lengths of months of the year in each quarter
int[][] months = { {31, 28, 31}, {30, 31, 30}, {31, 31, 30}, {31, 30, 31} };
มีหลายตำแหน่งที่คุณในฐานะโปรแกรมเมอร์อาจต้องการอาร์เรย์สองมิติ อาร์เรย์สองมิติเป็นรากฐานของเกมกระดานเกือบทุกประเภท เช่น หมากรุก หมากฮอส ทิก-แทค-โท และการต่อสู้ทางทะเล:
อาร์เรย์สองมิติเหมาะอย่างยิ่งสำหรับหมากรุกหรือการต่อสู้ทางทะเล เราต้องการเพียงตัวเลขจากพิกัดเซลล์ ไม่ใช่ 'จำนำ e2-e4' แต่เป็น 'จำนำ (5,2) -> (5,4)' มันจะง่ายยิ่งขึ้นสำหรับคุณในฐานะโปรแกรมเมอร์
2. การจัดเรียงองค์ประกอบในอาร์เรย์: (x, y) หรือ (y, x)
ยังไงก็ตาม มีปัญหาที่น่าสนใจอยู่ที่นี่:
เมื่อเราสร้างอาร์เรย์โดยใช้new int[2][5];
เรามีตาราง 'สองแถวและ 5 คอลัมน์ ' หรือเป็น 'สองคอลัมน์และ 5 แถว ' หรือไม่ กล่าวอีกนัยหนึ่งคือเราต้องระบุความกว้างก่อนแล้วจึงระบุความสูง... หรือ ในทางกลับกัน อันดับแรกคือความสูงและความกว้าง อย่างที่เราพูดกันบ่อยๆ ทุกอย่างไม่ง่ายนักที่นี่
เริ่มจากคำถามว่าอาร์เรย์ถูกเก็บไว้ในหน่วยความจำอย่างไร
แน่นอน หน่วยความจำคอมพิวเตอร์ไม่มีเมทริกซ์อยู่ในนั้น: แต่ละตำแหน่งในหน่วยความจำมีแอดเดรสตัวเลขตามลำดับ: 0, 1, 2, ... ในกรณีของเรา เราพูดถึงเมทริกซ์ขนาด 2 × 5 แต่ในหน่วยความจำ มันเป็นเพียง 10 เซลล์ติดต่อกัน ไม่มีอะไรเพิ่มเติม ไม่มีสิ่งใดบ่งชี้ว่าแถวและคอลัมน์อยู่ที่ไหน
ข้อโต้แย้งที่สนับสนุน "กว้าง x สูง"
ข้อโต้แย้งที่สนับสนุนแนวทางนี้คือทุกคนเรียนวิชาคณิตศาสตร์ในโรงเรียน ซึ่งพวกเขาเรียนรู้ว่าคู่พิกัดเขียนเป็น 'x' (นั่นคือแกนนอน) และ 'y' (มิติแนวตั้ง) และนี่ไม่ใช่แค่มาตรฐานของโรงเรียนเท่านั้น แต่เป็นมาตรฐานที่ยอมรับโดยทั่วไปในวิชาคณิตศาสตร์ อย่างที่เขาพูดกัน คุณไม่สามารถโต้เถียงกับคณิตศาสตร์ได้ อย่างนั้นเหรอ? ความกว้างก่อนแล้วตามด้วยความสูง?
ข้อโต้แย้งที่สนับสนุน "สูง x กว้าง"
นอกจากนี้ยังมีข้อโต้แย้งที่น่าสนใจสำหรับตำแหน่งนี้: การเริ่มต้นอาร์เรย์สองมิติอย่างรวดเร็ว แท้จริงแล้ว หากเราต้องการเริ่มต้นอาร์เรย์ของเรา เราก็สามารถเขียนโค้ดได้ดังนี้:
// Matrix of important data
int[][] matrix = { {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5} };
คุณไม่สังเกตอะไรเลยเหรอ? ถ้าเรามีสิ่งนี้ล่ะ?
// Matrix of important data
int[][] matrix = {
{1, 2, 3, 4, 5},
{1, 2, 3, 4, 5}
};
ถ้าเราเขียนข้อมูลในโค้ดทีละบรรทัด เราก็จะได้เมทริกซ์ที่มี 2 แถว 5 คอลัมน์
บรรทัดล่าง
เราพูดอะไรได้บ้าง? ขึ้นอยู่กับคุณที่จะตัดสินใจว่าสะดวกกว่าสำหรับคุณ สิ่งที่สำคัญที่สุดคือโปรแกรมเมอร์ทุกคนที่ทำงานในโครงการเดียวกันยึดแนวทางเดียวกัน
หากคุณทำงานในโปรเจ็กต์ที่โค้ดมีอาร์เรย์สองมิติที่กำหนดค่าเริ่มต้นจำนวนมาก ดังนั้นเป็นไปได้มากว่าทุกอย่างในโปรเจ็กต์นั้นจะขึ้นอยู่กับการเริ่มต้นข้อมูลที่รวดเร็ว กล่าวคือ คุณจะมี 'ความสูง x ความกว้าง' มาตรฐาน
หากคุณโชคดีพอที่จะพบว่าตัวเองอยู่ในโปรเจ็กต์ที่เกี่ยวข้องกับคณิตศาสตร์จำนวนมากและทำงานกับพิกัด (เช่น เอ็นจิ้นเกม) โค้ดนั้นมักจะใช้วิธี 'กว้าง x สูง'
3. วิธีการจัดเรียงอาร์เรย์สองมิติ
และตอนนี้คุณจะได้เรียนรู้วิธีการจัดเรียงอาร์เรย์สองมิติ พร้อม?
อาร์เรย์สองมิติเป็นอาร์เรย์ของอาร์เรย์จริงๆ!
กล่าวอีกนัยหนึ่ง ถ้าในกรณีของอาร์เรย์ธรรมดา ตัวแปรอาร์เรย์จัดเก็บการอ้างอิงไปยังคอนเทนเนอร์ที่เก็บองค์ประกอบอาร์เรย์ ในกรณีของอาร์เรย์สองมิติ สถานการณ์จะระเบิดเล็กน้อย: ตัวแปรอาร์เรย์สองมิติจะเก็บ การอ้างอิงไปยังคอนเทนเนอร์ที่เก็บการอ้างอิงถึงอาร์เรย์หนึ่งมิติ เป็นการดีกว่าที่จะเห็นการดำเนินการเพียงครั้งเดียวแทนที่จะพยายามอธิบายเป็นร้อยครั้ง:
ทางด้านซ้ายเรามีตัวแปรอาร์เรย์สองมิติ ซึ่งเก็บการอ้างอิงไปยังวัตถุอาร์เรย์สองมิติ ในตรงกลางเรามีวัตถุอาร์เรย์สองมิติซึ่งเซลล์เก็บอาร์เรย์หนึ่งมิติ ซึ่งเป็นแถวของอาร์เรย์สองมิติ และทางด้านขวาคุณจะเห็นอาร์เรย์หนึ่งมิติสี่ตัว ซึ่งเป็นแถวของอาร์เรย์สองมิติของเรา
นี่เป็นวิธีที่อาร์เรย์สองมิติใช้งานได้จริง และวิธีการนี้ทำให้โปรแกรมเมอร์ Java ได้เปรียบหลายประการ:
ประการแรกเนื่องจาก 'คอนเทนเนอร์ของคอนเทนเนอร์' เก็บการอ้างอิงถึง 'อาร์เรย์ของแถว' เราจึงสามารถสลับแถวได้อย่างรวดเร็วและง่ายดาย ในการรับ 'คอนเทนเนอร์ของคอนเทนเนอร์' คุณต้องระบุหนึ่งดัชนีแทนที่จะเป็นสอง ตัวอย่าง:
int[][] data = new int[2][5];
int[] row1 = data[0];
int[] row2 = data[1];
รหัสนี้ให้คุณสลับแถว:
|
อาร์เรย์สองมิติmatrix[0] เก็บการอ้างอิงถึงแถวแรก เราแลกเปลี่ยนข้อมูลอ้างอิง เป็นผลให้ matrix อาร์เรย์มีลักษณะดังนี้:
|
หากคุณอ้างถึงเซลล์ของอาร์เรย์สองมิติ แต่คุณระบุเพียงหนึ่งดัชนีตามหลังชื่อของอาร์เรย์ แสดงว่าคุณกำลังอ้างถึงคอนเทนเนอร์ของคอนเทนเนอร์ที่เซลล์จัดเก็บการอ้างอิงถึงอาร์เรย์หนึ่งมิติธรรมดา
GO TO FULL VERSION