สวัสดี! ก่อนหน้านี้ในการฝึกอบรมของคุณ เราได้ทำงานกับวัตถุชิ้นเดียว (และประเภทดั้งเดิม) แต่ถ้าเราต้องการทำงานกับวัตถุทั้งกลุ่มแทนที่จะเป็นเพียงวัตถุเดียวล่ะ ตัวอย่างเช่น สมมติว่าเราต้องการสร้างรายการวันเกิดของพนักงานทุกคนในบริษัทของเรา ควรมี 30 สตริงที่มีรูป แบบดังนี้: "Sarah Huffman, 25 มกราคม" เราจะได้ประโยชน์จากโครงสร้างข้อมูลพิเศษที่เรียกว่าอาร์เรย์ หากเราเปรียบเทียบอาร์เรย์กับวัตถุจริง ก็จะคล้ายกับตู้เซฟของธนาคารที่มีตู้เซฟมาก อาร์เรย์ยังประกอบด้วย "กล่อง" อีกด้วย คุณสามารถใส่บางอย่าง (องค์ประกอบ) ลงในแต่ละกล่อง ในการเข้าถึงองค์ประกอบ คุณจำเป็นต้องทราบหมายเลขกล่อง (ดัชนี) นี่คือวิธีการสร้างอาร์เรย์:
แต่ละบรรทัดแสดงถึง
public class Main {
public static void main(String[] args) {
String [] birthdays = new String[10];
}
}
ที่นี่เราสร้างอาร์เรย์ที่มี 10 องค์ประกอบ คุณสามารถบันทึกคุณสมบัติบางอย่างของอาร์เรย์ได้ทันที:
- มันเก็บองค์ประกอบของประเภทข้อมูลที่กำหนดไว้อย่างดี หากเราสร้างอาร์เรย์แบบสตริง เราจะไม่สามารถเก็บสิ่งอื่นใดในนั้นได้ ชนิด ข้อมูลถูกระบุเมื่อสร้างอาร์เรย์ ซึ่งแตกต่างจากตู้นิรภัย (ซึ่งลูกค้าสามารถเก็บของที่ต้องการได้)
- ต้องระบุ ขนาด เมื่อ สร้างอาร์เรย์ คุณไม่สามารถระบุในภายหลังหรือเปลี่ยนขนาดหลังจากสร้างอาร์เรย์แล้ว
String [] birthdays = new String[10];
String birthdays [] = new String[10];
หากคุณต้องการเขียนบางอย่างลงในอาร์เรย์ คุณต้องระบุดัชนีของกล่องที่จะเขียนค่า กล่องในอาร์เรย์มีหมายเลขเริ่มต้นจาก 0 การนับโดยเริ่มจากศูนย์เป็นวิธีปฏิบัติทั่วไปในการเขียนโปรแกรม ยิ่งคุณคุ้นเคยเร็วเท่าไหร่ก็ยิ่งดีเท่านั้น :) หมายความว่า ถ้าคุณต้องการใส่ค่าในช่องแรกให้ทำดังนี้
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
}
}
ตอนนี้วันเกิดของ Jana ถูกจัดเก็บไว้ในเซลล์แรกของวันเกิดพนักงานของเรา: คุณสามารถเพิ่มค่าอื่นๆ ในลักษณะที่คล้ายกัน:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[7] = "Rosie Mills, January 3";
}
}
โปรดทราบว่าเราได้เพิ่มวันเกิดของ Rosie ในช่องที่แปด (คุณยังไม่ลืมว่าทำไมช่องที่ 7 ถึงเป็นช่องที่แปดใช่ไหม ) คุณจะเห็นว่าเรายังเติมเซลล์อื่นไม่ครบ เราไม่ต้องเขียนค่าลงในอาร์เรย์ตามลำดับ ไม่มีข้อกำหนดดังกล่าว แน่นอน การเขียนองค์ประกอบตามลำดับทำให้ง่ายต่อการติดตามจำนวนกล่องว่างและจำนวนที่ถูกครอบครอง และป้องกันไม่ให้อาร์เรย์มี "ช่องโหว่" หากคุณต้องการได้รับเนื้อหาของกล่องใดกล่องหนึ่ง (เช่นเดียวกับตู้นิรภัย) คุณจำเป็นต้องทราบหมายเลขของมัน นี่คือวิธีการ:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[7] = "Rosie Mills, January 3";
String rosieBirthday = birthdays[7];
System.out.println(rosieBirthday);
}
}
เอาต์พุตคอนโซล: Rosie Mills, 3 มกราคม เราสร้างString
ตัวแปรและบอกคอมไพเลอร์: "ค้นหากล่องที่มีดัชนี 7 ใน อาร์เรย์ วันเกิดและกำหนดค่าที่มีอยู่ให้กับString
ตัวแปรrosieBirthday " และนั่นคือสิ่งที่มันทำ เมื่อทำงานกับอาร์เรย์ เราสามารถหาความยาวได้อย่างง่ายดายโดยใช้คุณสมบัติพิเศษ: ความ ยาว
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[7] = "Rosie Mills, January 3";
int birthdaysLength = birthdays.length;
System.out.println(birthdaysLength);
}
}
เอาต์พุตคอนโซล: 10 หมายเหตุ: length
คุณสมบัติเก็บขนาดอาร์เรย์ ไม่ใช่จำนวนกล่องที่เต็ม อาร์เรย์ของเราเก็บเพียง 3 ค่า แต่เราระบุขนาดของมันเป็น 10 เมื่อเราสร้างขึ้น และนี่คือค่าที่length
ฟิลด์ส่งคืน ทำไมสิ่งนี้ถึงมีประโยชน์ สมมติว่าคุณต้องการแสดงรายการวันเกิดทั้งหมด (เพื่อตรวจสอบว่าไม่มีใครลืม) คุณสามารถทำได้ในวงเดียวง่ายๆ:
public class Main {
public static void main(String[] args) {
String birthdays [] = new String[10];
birthdays[0] = "Jana Russell, March 12";
birthdays[1] = "Landon Chan, May 18";
birthdays[2] = "Jeremiah Leonard, July 12";
birthdays [3] = "Kenny Russo, September 7";
birthdays[4] = "Tommie Barnes, November 9";
birthdays [5] = "Roman Baranov, August 14";
birthdays [6] = "Chanice Andersen, April 1";
birthdays[7] = "Rosie Mills, January 3";
birthdays [8] = "Keenan West, October 19";
birthdays [9] = "Abraham McArthur, May 3";
for (int i = 0; i < birthdays.length; i++) {
System.out.println(birthdays[i]);
}
}
}
ในลูป เราประกาศตัวแปรi
ซึ่งเริ่มต้นเป็นศูนย์ ในแต่ละรอบ เราได้รับองค์ประกอบที่มีดัชนี i จากอาร์เรย์ของเราและแสดงค่าของมัน ลูปจะทำการวนซ้ำ 10 ครั้ง และ i จะเพิ่มจาก 0 เป็น 9—และตัวเลขก็เป็นดัชนีขององค์ประกอบของอาร์เรย์ของเรา! ด้วยเหตุนี้ เราจะแสดงค่าทั้งหมดตั้งแต่วันเกิด[0]ถึงวันเกิด[9] จริงๆ แล้ว คุณสามารถสร้างอาร์เรย์ได้อีกวิธีหนึ่ง ตัวอย่างเช่น คุณสามารถสร้างอาร์เรย์ของint
s ดังนี้:
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
}
}
เทคนิคนี้เรียกว่า "การเริ่มต้นทางลัด" ค่อนข้างสะดวกเพราะเราสร้างอาร์เรย์และเติมค่าลงไปพร้อมกัน เราไม่จำเป็นต้องระบุขนาดอาร์เรย์อย่างชัดเจน: ด้วยการเริ่มต้นทางลัดlength
ฟิลด์จะถูกตั้งค่าโดยอัตโนมัติ
public class Main {
public static void main(String[] args) {
int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
System.out.println(numbers.length);
}
}
เอาต์พุตของคอนโซล: 9 ตอนนี้ เล็กน้อยเกี่ยวกับการจัดเก็บอาร์เรย์ในหน่วยความจำ สมมติว่าเรามีอาร์เรย์ของCat
วัตถุสามชิ้น:
public class Cat {
private String name;
public Cat(String name) {
this.name = name;
}
public static void main(String[] args) {
Cat[] cats = new Cat[3];
cats[0] = new Cat("Thomas");
cats[1] = new Cat("Behemoth");
cats[2] = new Cat("Lionel Messi");
}
}
คุณต้องเข้าใจบางสิ่งที่นี่:
-
ในกรณีของ primitives อาร์เรย์จะเก็บชุดของค่าเฉพาะ (เช่น
int
s) ในกรณีของ วัตถุอาร์เรย์จะเก็บชุดของการอ้างอิง
อาร์เรย์cats
ประกอบด้วยสามองค์ประกอบ ซึ่งแต่ละองค์ประกอบอ้างอิงถึงCat
วัตถุ การอ้างอิงแต่ละรายการชี้ไปยังที่อยู่หน่วยความจำซึ่งเก็บวัตถุที่เกี่ยวข้องไว้ - องค์ประกอบอาร์เรย์ถูกจัดเรียงในบล็อกเดียวในหน่วยความจำ สิ่งนี้ทำเพื่อให้สามารถเข้าถึงได้อย่างรวดเร็วและมีประสิทธิภาพ
cats
อ้างอิงบล็อกของหน่วยความจำที่เก็บวัตถุทั้งหมด (องค์ประกอบอาร์เรย์) Cats[0]
อ้างอิงที่อยู่เฉพาะภายในบล็อกนี้ สิ่งสำคัญคือต้องเข้าใจว่าอาร์เรย์ไม่เพียงแค่จัดเก็บวัตถุเท่านั้น แต่ยังเป็นวัตถุอีกด้วย สิ่งนี้ทำให้เราเกิดคำถามว่าเราสามารถสร้างอาร์เรย์ของสตริงหรือตัวเลขได้หรือไม่ แต่ยังรวมถึงอาร์เรย์ของอาร์เรย์ด้วย และคำตอบคือใช่ เราทำได้! อาร์เรย์สามารถจัดเก็บวัตถุใด ๆ รวมถึงอาร์เรย์อื่น ๆ อาร์เรย์ดังกล่าวเรียกว่าสองมิติ หากเราต้องแสดงด้วยสายตา มันจะคล้ายกับตารางทั่วไปมาก สมมติว่าเราต้องการสร้างอาร์เรย์3 อาร์เรย์ซึ่งแต่ละอาร์เรย์สามารถเก็บได้ 10 int
วินาที มันจะมีลักษณะดังนี้:
int
อาร์เรย์ อาร์เรย์แรกมีตัวเลขตั้งแต่ 1 ถึง 10 อาร์เรย์ที่สองมีตั้งแต่ -1 ถึง -10 และตัวที่สามเป็นชุดตัวเลขสุ่ม แต่ละอาร์เรย์เหล่านี้ถูกเก็บไว้ในกล่องของอาร์เรย์สองมิติของเรา ในโค้ด การเริ่มต้นอาร์เรย์สองมิติจะมีลักษณะดังนี้:
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
}
แมว อาร์เรย์สองมิติของเราจัดเก็บอาร์เรย์ 3 อาร์เรย์โดยมี 5 กล่องในแต่ละอาร์เรย์ ถ้าเราต้องการวางวัตถุในช่องที่สามของอาร์เรย์ที่สอง เราจะทำดังนี้
public static void main(String[] args) {
Cat[][] cats = new Cat[3][5];
cats[1][2] = new Cat("Fluffy");
}
[1]
ระบุอาร์เรย์ที่สอง และ[2]
ระบุช่องที่สามของอาร์เรย์นั้น เนื่องจากอาร์เรย์สองมิติประกอบด้วยอาร์เรย์หลายตัว เพื่อที่จะวนซ้ำและแสดงค่าทั้งหมดของมัน (หรือเติมองค์ประกอบทั้งหมดของมัน) เราจำเป็นต้องมีการวนซ้ำที่ซ้อนกัน:
for (int i = 0; i < cats.length; i++) {
for (int j = 0; j < cats[i].length; j++) {
System.out.println(cats[i][j]);
}
}
ในวงรอบนอก (ตัวแปรi
) เราวนซ้ำอาร์เรย์ทั้งหมดในอาร์เรย์สองมิติของเรา ในวงใน (ตัวแปรj
) เราจะผ่านองค์ประกอบทั้งหมดของแต่ละอาร์เรย์ ด้วยเหตุนี้cat[0][0] (อาร์เรย์แรก องค์ประกอบแรก) จะแสดงก่อน ตามด้วยcat[0][1] (อาร์เรย์แรก องค์ประกอบที่สอง) หลังจากที่เราผ่านอาร์เรย์แรกแล้ว เราจะแสดงcat[1][0] , cats[1][1] , cats[1][2]ฯลฯ อย่างไรก็ตาม อาร์เรย์สองมิติยังรองรับ การเริ่มต้นชวเลข:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
โดยปกติแล้ว เราจะประกาศอาร์เรย์สองมิติnumbers
เป็นint[3][3]
, แต่การชวเลขนี้ช่วยให้เราระบุค่าได้ทันที ทำไมคุณถึงต้องการอาร์เรย์สองมิติ คุณสามารถใช้เกมหนึ่งเพื่อสร้างเกม "Battleship" ที่มีชื่อเสียงได้อย่างง่ายดาย: ใน "Battleship" โครงสร้างของสนามแข่งขันสามารถอธิบายได้ง่ายๆ: อาร์เรย์สองมิติ 10 อาร์เรย์ แต่ละองค์ประกอบ 10 องค์ประกอบ คุณสร้างสองอาร์เรย์เหล่านี้ (อันหนึ่งสำหรับคุณและอีกอันสำหรับคู่ต่อสู้ของคุณ)
int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
ใช้ค่าบางอย่าง (เช่น ตัวเลขหรือสัญลักษณ์) เพื่อเติมองค์ประกอบที่สอดคล้องกับตำแหน่งของเรือของคุณ จากนั้นผลัดกันเรียกพิกัดสำหรับองค์ประกอบเฉพาะ:
- battleshipBoard1[0][2]!
- นางสาว! battleshipBoard2[2][4]!
- ตี!
- battleshipBoard2[2][5]!
- ตี!
- battleshipBoard2[2][6]!,
- จม!
GO TO FULL VERSION