JavaRush /จาวาบล็อก /Random-TH /บางอย่างเกี่ยวกับอาร์เรย์ใน Java

บางอย่างเกี่ยวกับอาร์เรย์ใน Java

เผยแพร่ในกลุ่ม
สวัสดี! ก่อนหน้านี้ ในระหว่างการฝึก เราทำงานกับวัตถุชิ้นเดียว (หรือประเภทดั้งเดิม) แต่จะเกิดอะไรขึ้นถ้าเราจำเป็นต้องทำงานไม่ใช่กับวัตถุชิ้นเดียว แต่กับทั้งกลุ่มล่ะ? ตัวอย่างเช่น เราต้องการสร้างรายการวันเกิดของพนักงานทุกคนในบริษัทของเรา ควรมี 30 บรรทัดในรูปแบบ: “Andrey Petrov, 25 มกราคม” โครงสร้างข้อมูลพิเศษ อาร์เรย์ จะช่วยเราได้ หากคุณเปรียบเทียบอาร์เรย์กับวัตถุในชีวิตจริง โครงสร้างจะคล้ายกับห้องนิรภัยของธนาคารที่มีเซลล์มาก: บางอย่างเกี่ยวกับอาร์เรย์ใน Java - 1อาร์เรย์ยังประกอบด้วยเซลล์ด้วย คุณสามารถใส่บางอย่างลงในแต่ละเซลล์ได้ ในกรณีนี้ ในการเข้าถึงเนื้อหา คุณต้องทราบหมายเลขเซลล์ อาร์เรย์ถูกสร้างขึ้นดังนี้:
public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10]; // array of Java strings

   }
}
ที่นี่เราได้สร้างอาร์เรย์จำนวน 10 เซลล์ คุณสามารถใส่ใจกับคุณสมบัติบางอย่างของอาเรย์ได้ทันที:
  1. มันเก็บข้อมูลประเภทที่กำหนดไว้อย่างเคร่งครัด หากเราสร้างอาร์เรย์สตริงขึ้นมาตั้งแต่แรกStringเราจะไม่สามารถเก็บสิ่งอื่นใดไว้ในนั้นได้ ชนิดข้อมูลถูกระบุเมื่อสร้างอาร์เรย์ นี่คือสิ่งที่แตกต่างจากตู้เซฟซึ่งลูกค้าสามารถเก็บทุกสิ่งที่เขาต้องการได้
  2. อาร์เรย์สามารถจัดเก็บข้อมูลประเภทดั้งเดิม (เช่นint) สตริง ( String) หรืออ็อบเจ็กต์ของคลาสเดียวกัน แม่นยำยิ่งขึ้นไม่ใช่แม้แต่วัตถุเอง แต่เชื่อมโยงไปยังวัตถุเหล่านี้
  3. ต้องระบุขนาดของอาร์เรย์ในระหว่างการสร้าง คุณจะไม่สามารถระบุในภายหลังหรือปรับขนาดได้หลังจากสร้างแล้ว
Java ระบุว่าอาร์เรย์กำลังถูกสร้างขึ้นโดยใช้วงเล็บเหลี่ยม[]ทั้งสองด้านของนิพจน์ สามารถระบุได้ก่อนชื่อของตัวแปรอ้างอิงหรือหลัง - มันจะทำงานด้วยวิธีใดวิธีหนึ่ง:
//Java arrays of strings, two syntaxes
String [] birthdays = new String[10];
String birthdays [] = new String[10];
หากคุณต้องการเขียนบางสิ่งลงในอาร์เรย์ คุณต้องระบุจำนวนเซลล์ที่จะเขียนค่านั้น จำนวนเซลล์อาร์เรย์เริ่มต้นที่ 0 การเริ่มจากศูนย์เป็นแนวทางปฏิบัติทั่วไปในการเขียนโปรแกรม ยิ่งคุณคุ้นเคยเร็วเท่าไหร่ก็ยิ่งดีเท่านั้น :) บางอย่างเกี่ยวกับอาร์เรย์ใน Java - 2นั่นคือถ้าคุณต้องการใส่ค่าลงในเซลล์แรกของอาร์เรย์จะทำดังนี้:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
   }
}
ตอนนี้เซลล์แรกของอาร์เรย์ของเราซึ่งประกอบด้วยวันเกิดของเพื่อนร่วมงาน มีสตริงที่มีวันเกิดของ Lena โดยการเปรียบเทียบ คุณสามารถเพิ่มค่าอื่นๆ ได้:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";
   }
}
โปรดทราบ: เราได้เพิ่มวันเกิดของ Olesya ลงในเซลล์ที่แปด (คุณลืมหรือเปล่าว่าทำไมเซลล์หมายเลข 7 จึงเป็นเซลล์ที่แปด) แม้ว่าเซลล์อื่นๆ ทั้งหมดจะไม่ได้ถูกกรอกลงไปก็ตาม ไม่จำเป็นต้องเขียนค่าลงในอาร์เรย์ตามลำดับ - ไม่มีข้อจำกัดดังกล่าว ในทางกลับกัน หากคุณเขียนตามลำดับ จะง่ายกว่ามากในการติดตามจำนวนเซลล์ว่างและเซลล์ที่ถูกครอบครอง และจะไม่มี "รู" เหลืออยู่ในอาร์เรย์ หากคุณต้องการรับเนื้อหาของเซลล์อาร์เรย์ เช่น ในกรณีของเซลล์ธนาคาร คุณจำเป็นต้องทราบหมายเลขของเซลล์นั้น ทำเช่นนี้:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";

       String olesyaBirthday = birthdays[7];
       System.out.println(olesyaBirthday);
   }
}
เอาต์พุตคอนโซล:

Олеся Остапенко, 3 января
เราสร้างตัวแปรStringและบอกคอมไพเลอร์ว่า: “ค้นหาเซลล์ที่มีดัชนี 7 ในอาร์เรย์birthdaysและกำหนดค่าที่เก็บไว้ให้กับตัวแปรString olesyaBirthday” นั่นคือสิ่งที่เขาทำ

ความยาวอาร์เรย์ Java

เมื่อทำงานกับอาร์เรย์ คุณสามารถค้นหาความยาวของอาร์เรย์ได้อย่างง่ายดายโดยใช้คุณสมบัติพิเศษlength-
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[7] = "Olesya Ostapenko, January 3";

       int birthdaysLength = birthdays.length;
       System.out.println(birthdaysLength);
   }
}
เอาต์พุตคอนโซล:

10
บันทึก:คุณสมบัติlengthจะจัดเก็บขนาดของอาร์เรย์ ไม่ใช่จำนวนเซลล์ที่เติม อาร์เรย์ของเราเก็บค่าไว้เพียง 3 ค่า แต่เมื่อเราสร้างมันขึ้นมา เราได้ระบุ size = 10 ไว้ นี่คือค่าที่ฟิลด์ส่งlengthคืน เหตุใดสิ่งนี้จึงอาจมีประโยชน์ ตัวอย่างเช่น หากคุณต้องการพิมพ์รายการวันเกิดทั้งหมดไปยังคอนโซล (เพื่อตรวจสอบว่าไม่มีใครถูกลืม) คุณสามารถทำได้ในวงเดียวง่ายๆ:
public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Lena Eliseeva, March 12";
       birthdays[1] = "Kolya Romanov, May 18";
       birthdays[2] = "Vika Ignatova, July 12";
       birthdays[3] = "Denis Kozlov, September 7";
       birthdays[4] = "Maxim Maslennikov, November 9";
       birthdays[5] = "Roman Baranov, August 14";
       birthdays[6] = "Valery Pyatkina, April 1";
       birthdays[7] = "Olesya Ostapenko, January 3";
       birthdays[8] = "Kostya Gurko, October 19";
       birthdays[9] = "Seryozha Naumov, May 3";

       for (int i = 0; i < birthdays.length; i++) {
           System.out.println(birthdays[i]);
       }
   }
}
ในลูปเราสร้างตัวแปรiที่เริ่มแรกเท่ากับศูนย์ ในแต่ละรอบ เราจะนำเซลล์ที่มีดัชนี i จากอาร์เรย์ของเราและพิมพ์ค่าของมันไปยังคอนโซล การวนซ้ำจะวนซ้ำ 10 ครั้งและค่า i จะเพิ่มขึ้นจาก 0 เป็น 9 - เพียงตามดัชนีของเซลล์ในอาร์เรย์ของเรา! วิธีนี้เราจะพิมพ์ค่าทั้งหมดจากbirthdays[0]ไป ยัง คอนโซล birthdays[9] . จริงๆ แล้วมีวิธีสร้างอาร์เรย์ที่แตกต่างกันออกไป ตัวอย่างเช่น คุณสามารถสร้างอาร์เรย์ของตัวเลขintได้ดังนี้:
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

อาร์เรย์วัตถุ Java

คุณคงเคยได้ยินมาว่าอาร์เรย์ของอ็อบเจ็กต์และอาร์เรย์ของวัตถุดั้งเดิมถูกจัดเก็บไว้ในหน่วยความจำแตกต่างกัน ยกตัวอย่างอาร์เรย์ของวัตถุสามรายการ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("Hippopotamus");
       cats[2] = new Cat("Philip Markovich");
   }
}
มีบางสิ่งที่ต้องทำความเข้าใจที่นี่:
  1. ในกรณีของพื้นฐาน อาร์เรย์ Java จะเก็บค่าเฉพาะจำนวนมาก (เช่น ตัวเลขint) ในกรณีของอ็อบเจ็กต์ อาร์เรย์จะเก็บข้อมูลอ้างอิงจำนวนมาก อาร์เรย์catsประกอบด้วยสามเซลล์ ซึ่งแต่ละเซลล์มีการอ้างอิงไปยังCatวัตถุ แต่ละลิงก์จะชี้ไปยังที่อยู่ในหน่วยความจำที่จัดเก็บออบเจ็กต์นั้นไว้
  2. องค์ประกอบอาร์เรย์จะถูกเก็บไว้ในหน่วยความจำในบล็อกเดียว สิ่งนี้ทำเพื่อการเข้าถึงที่มีประสิทธิภาพและรวดเร็วยิ่งขึ้น ดังนั้นลิงก์catsจะชี้ไปที่บล็อกในหน่วยความจำซึ่งวัตถุทั้งหมดซึ่งเป็นองค์ประกอบของอาเรย์จะถูกเก็บไว้ เอcats[0]- ไปยังที่อยู่เฉพาะภายในบล็อกนี้
บางอย่างเกี่ยวกับอาร์เรย์ใน Java - 3สิ่งสำคัญคือต้องเข้าใจว่าอาร์เรย์ไม่เพียงแต่สามารถจัดเก็บวัตถุได้เท่านั้น แต่ยังเป็นวัตถุอีกด้วย

อาร์เรย์ของอาร์เรย์หรืออาร์เรย์สองมิติ

จากนี้ เรากำลังเผชิญกับคำถาม - เราสามารถสร้างตัวอย่างไม่ใช่อาร์เรย์ของสตริงหรือตัวเลข แต่เป็นอาร์เรย์ของอาร์เรย์ได้หรือไม่ และคำตอบก็คือ - ใช่ เราทำได้! อาร์เรย์สามารถจัดเก็บวัตถุใดๆ ภายในนั้น รวมถึงอาร์เรย์อื่นๆ ด้วย อาร์เรย์ดังกล่าวจะเรียกว่าสองมิติ หากวาดภาพจะดูคล้ายกับโต๊ะทั่วไปมาก ตัวอย่างเช่น เราต้องการสร้างอาร์เรย์ที่จะเก็บตัวเลข 3 อาร์เรย์intโดยแต่ละอาร์เรย์มี 10 เซลล์ ซึ่งจะมีลักษณะดังนี้: บางอย่างเกี่ยวกับอาร์เรย์ใน Java - 4แต่ละบรรทัดแสดงถึงอาร์เรย์ของ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("Fluff");
}
[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) เราวนซ้ำเซลล์ทั้งหมดของแต่ละอาร์เรย์ ด้วยเหตุนี้ วัตถุcats[0][0](อาร์เรย์แรก เซลล์แรก) จะถูกแสดงเป็นอันดับแรกบนคอนโซล และวัตถุที่สองจะเป็นcats[0][1](อาร์เรย์แรก เซลล์ที่สอง) เมื่ออาร์เรย์แรกหมด , , cats[1][0]และcats[1][1]อื่นcats[1][2]ๆ จะถูกส่งออก อย่างไรก็ตาม การเริ่มต้นอย่างรวดเร็วยังมีให้สำหรับอาร์เรย์สองมิติด้วย:
int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
โดยปกติเราจะเขียนอาร์เรย์สองมิติnumbersเป็นint[3][3]แต่วิธีนี้ช่วยให้เราสามารถระบุค่าได้ทันที เหตุใดจึงต้องมีอาร์เรย์สองมิติ ตัวอย่างเช่นด้วยความช่วยเหลือคุณสามารถสร้างเกม Battleship ที่มีชื่อเสียงขึ้นมาใหม่ได้อย่างง่ายดาย: บางอย่างเกี่ยวกับอาร์เรย์ใน Java - 5โครงสร้างของสนามเด็กเล่นใน Battleship นั้นสามารถอธิบายได้ง่าย: อาร์เรย์สองมิติ 10 อาร์เรย์ 10 เซลล์แต่ละเซลล์ . คุณสร้างอาร์เรย์ดังกล่าวสองชุด - สำหรับตัวคุณเองและคู่ต่อสู้:
int [][] seaBattle = new int[10][10];
int [][] seaBattle2 = new int[10][10];
คุณกรอกค่าบางอย่าง (เช่น ตัวเลขหรือเครื่องหมาย*) เซลล์ที่เรือของคุณตั้งอยู่ จากนั้นคุณและคู่ต่อสู้จะผลัดกันเรียกหมายเลขเซลล์:
  • ซีแบทเทิล[6][5]!
  • อดีต! ซีแบทเทิล2[6][6]!
  • ได้รับบาดเจ็บ!
  • ซีแบทเทิล2[6][7]!
  • ได้รับบาดเจ็บ!
  • ทะเลแบทเทิล2[6][8]!,
  • ฆ่าแล้ว!

แหล่งข้อมูลเพิ่มเติมเกี่ยวกับอาร์เรย์

ต้องการทราบข้อมูลเพิ่มเติมเกี่ยวกับอาร์เรย์หรือไม่ โปรดดูบทความด้านล่างนี้ มีข้อมูลที่น่าสนใจและมีประโยชน์มากมายในหัวข้อนี้
  1. อาร์เรย์ใน Java - บทความโดยละเอียดเกี่ยวกับอาร์เรย์ การสร้าง การเริ่มต้น และการใช้งาน พร้อมตัวอย่าง
  2. คลาส Arrays และการใช้งาน - บทความนี้จะอธิบายวิธีการบางอย่างของคลาสArray
  3. Arrays เป็นการบรรยาย JavaRush ครั้งแรกที่เน้นเรื่องอาร์เรย์โดยเฉพาะ
  4. อาร์เรย์หลายมิติ - บทความโดยละเอียดเกี่ยวกับอาร์เรย์หลายมิติพร้อมตัวอย่าง
  5. ส่งคืนอาร์เรย์ที่มีความยาวเป็นศูนย์ ไม่ใช่ null - ผู้เขียนการเขียนโปรแกรมที่มีประสิทธิภาพ Joshua Bloch พูดถึงวิธีส่งคืนอาร์เรย์ว่างได้ดีขึ้น
นี่เป็นการสรุปความคุ้นเคยครั้งแรกของเรากับอาร์เรย์ แต่นี่เป็นเพียงจุดเริ่มต้นของการโต้ตอบกับพวกมัน ในการบรรยายต่อไปนี้ เราจะดูวิธีใช้งานที่น่าสนใจ และดูว่าฟังก์ชันในตัว Java มีอะไรบ้าง เพื่อให้ทำงานกับโครงสร้างข้อมูลนี้ได้สะดวกยิ่งขึ้น :)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION