CodeGym /จาวาบล็อก /สุ่ม /บางอย่างเกี่ยวกับอาร์เรย์
John Squirrels
ระดับ
San Francisco

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

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

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
ที่นี่เราสร้างอาร์เรย์ที่มี 10 องค์ประกอบ คุณสามารถบันทึกคุณสมบัติบางอย่างของอาร์เรย์ได้ทันที:
  1. มันเก็บองค์ประกอบของประเภทข้อมูลที่กำหนดไว้อย่างดี หากเราสร้างอาร์เรย์แบบสตริง เราจะไม่สามารถเก็บสิ่งอื่นใดในนั้นได้ ชนิด ข้อมูลถูกระบุเมื่อสร้างอาร์เรย์ ซึ่งแตกต่างจากตู้นิรภัย (ซึ่งลูกค้าสามารถเก็บของที่ต้องการได้)

  2. ต้องระบุ ขนาด เมื่อ สร้างอาร์เรย์ คุณไม่สามารถระบุในภายหลังหรือเปลี่ยนขนาดหลังจากสร้างอาร์เรย์แล้ว
ความจริงที่ว่าเรากำลังสร้างอาร์เรย์นั้นถูกระบุด้วยวงเล็บเหลี่ยมทั้งสองด้านของนิพจน์ สามารถระบุก่อนหรือหลังชื่อของตัวแปรอ้างอิง ทั้งสองวิธีจะทำงาน:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
หากคุณต้องการเขียนบางอย่างลงในอาร์เรย์ คุณต้องระบุดัชนีของกล่องที่จะเขียนค่า กล่องในอาร์เรย์มีหมายเลขเริ่มต้นจาก 0 การนับโดยเริ่มจากศูนย์เป็นวิธีปฏิบัติทั่วไปในการเขียนโปรแกรม ยิ่งคุณคุ้นเคยเร็วเท่าไหร่ก็ยิ่งดีเท่านั้น :) บางอย่างเกี่ยวกับอาร์เรย์ - 2หมายความว่า ถ้าคุณต้องการใส่ค่าในช่องแรกให้ทำดังนี้

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] จริงๆ แล้ว คุณสามารถสร้างอาร์เรย์ได้อีกวิธีหนึ่ง ตัวอย่างเช่น คุณสามารถสร้างอาร์เรย์ของints ดังนี้:

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");
   }
}
คุณต้องเข้าใจบางสิ่งที่นี่:
  1. ในกรณีของ primitives อาร์เรย์จะเก็บชุดของค่าเฉพาะ (เช่นints) ในกรณีของ วัตถุอาร์เรย์จะเก็บชุดของการอ้างอิง
    อาร์เรย์catsประกอบด้วยสามองค์ประกอบ ซึ่งแต่ละองค์ประกอบอ้างอิงถึงCatวัตถุ การอ้างอิงแต่ละรายการชี้ไปยังที่อยู่หน่วยความจำซึ่งเก็บวัตถุที่เกี่ยวข้องไว้

  2. องค์ประกอบอาร์เรย์ถูกจัดเรียงในบล็อกเดียวในหน่วยความจำ สิ่งนี้ทำเพื่อให้สามารถเข้าถึงได้อย่างรวดเร็วและมีประสิทธิภาพ
ดังนั้นcatsอ้างอิงบล็อกของหน่วยความจำที่เก็บวัตถุทั้งหมด (องค์ประกอบอาร์เรย์) Cats[0]อ้างอิงที่อยู่เฉพาะภายในบล็อกนี้ บางอย่างเกี่ยวกับอาร์เรย์ - 3 สิ่งสำคัญคือต้องเข้าใจว่าอาร์เรย์ไม่เพียงแค่จัดเก็บวัตถุเท่านั้น แต่ยังเป็นวัตถุอีกด้วย สิ่งนี้ทำให้เราเกิดคำถามว่าเราสามารถสร้างอาร์เรย์ของสตริงหรือตัวเลขได้หรือไม่ แต่ยังรวมถึงอาร์เรย์ของอาร์เรย์ด้วย และคำตอบคือใช่ เราทำได้! อาร์เรย์สามารถจัดเก็บวัตถุใด ๆ รวมถึงอาร์เรย์อื่น ๆ อาร์เรย์ดังกล่าวเรียกว่าสองมิติ หากเราต้องแสดงด้วยสายตา มันจะคล้ายกับตารางทั่วไปมาก สมมติว่าเราต้องการสร้างอาร์เรย์3 อาร์เรย์ซึ่งแต่ละอาร์เรย์สามารถเก็บได้ 10 intวินาที มันจะมีลักษณะดังนี้:
บางอย่างเกี่ยวกับอาร์เรย์ - 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("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" ที่มีชื่อเสียงได้อย่างง่ายดาย: บางอย่างเกี่ยวกับอาร์เรย์ - 5 ใน "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]!,
  • จม!
นี่เป็นการสรุปการแนะนำอาร์เรย์ครั้งแรกของเรา แต่นี่เป็นเพียงจุดเริ่มต้นของการโต้ตอบกับพวกเขาเท่านั้น ในบทเรียนต่อไปนี้ เราจะเห็นวิธีที่น่าสนใจในการใช้งาน และยังได้เรียนรู้ว่า Java มีฟังก์ชันในตัวอะไรบ้างที่ช่วยให้เราทำงานกับโครงสร้างข้อมูลนี้ได้สะดวกยิ่งขึ้น :)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION