1. อาร์เรย์สองมิติ

อีกหนึ่งข้อเท็จจริงที่น่าสนใจเกี่ยวกับอาร์เรย์ อาร์เรย์ไม่ได้มีเพียงมิติเดียว (เชิงเส้น) นอกจากนี้ยังสามารถเป็นสองมิติ

คุณถามหมายความว่าอย่างไร

ซึ่งหมายความว่าเซลล์ของอาร์เรย์สามารถแสดงได้ไม่เพียงแค่คอลัมน์ (หรือแถว) แต่ยังรวมถึงตารางสี่เหลี่ยมด้วย

int[][] name = new int[width][height];

โดยที่nameคือชื่อของตัวแปรอาร์เรย์ความกว้างคือความกว้างของตาราง (ในเซลล์) และความสูงคือความสูงของตาราง ตัวอย่าง:

int[][] data = new int[2][5];
data[1][1] = 5;
เราสร้างอาร์เรย์สองมิติ: 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} };

มีหลายตำแหน่งที่คุณในฐานะโปรแกรมเมอร์อาจต้องการอาร์เรย์สองมิติ อาร์เรย์สองมิติเป็นรากฐานของเกมกระดานเกือบทุกประเภท เช่น หมากรุก หมากฮอส ทิก-แทค-โท และการต่อสู้ทางทะเล:

อาร์เรย์สองมิติ2

อาร์เรย์สองมิติเหมาะอย่างยิ่งสำหรับหมากรุกหรือการต่อสู้ทางทะเล เราต้องการเพียงตัวเลขจากพิกัดเซลล์ ไม่ใช่ 'จำนำ 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 of important data
int[][] matrix = {
  {1, 2, 3, 4, 5},
  {5, 4, 3, 2, 1}
};

int[] tmp = matrix[0];
matrix[0] = matrix[1];
matrix[1] = tmp;
อาร์เรย์สองมิติ





matrix[0]เก็บการอ้างอิงถึงแถวแรก
เราแลกเปลี่ยนข้อมูลอ้างอิง

เป็นผลให้matrixอาร์เรย์มีลักษณะดังนี้:
{
  {5, 4, 3, 2, 1},
  {1, 2, 3, 4, 5}
};

หากคุณอ้างถึงเซลล์ของอาร์เรย์สองมิติ แต่คุณระบุเพียงหนึ่งดัชนีตามหลังชื่อของอาร์เรย์ แสดงว่าคุณกำลังอ้างถึงคอนเทนเนอร์ของคอนเทนเนอร์ที่เซลล์จัดเก็บการอ้างอิงถึงอาร์เรย์หนึ่งมิติธรรมดา