CodeGym /Blog Java /Ngẫu nhiên /Đôi điều về mảng

Đôi điều về mảng

Xuất bản trong nhóm
CHÀO! Trước đây trong khóa đào tạo của bạn, chúng tôi đã làm việc với các đối tượng đơn lẻ (và các kiểu nguyên thủy). Nhưng nếu chúng ta cần làm việc với cả một nhóm đối tượng thay vì chỉ một đối tượng thì sao? Ví dụ: giả sử chúng tôi muốn tạo một danh sách ngày sinh nhật của tất cả nhân viên tại công ty của chúng tôi. Nó phải chứa 30 chuỗi được định dạng như sau: "Sarah Huffman, ngày 25 tháng 1" Chúng ta sẽ được hưởng lợi từ cấu trúc dữ liệu đặc biệt được gọi là mảng . Nếu chúng ta so sánh một mảng với một đối tượng thực, thì nó rất giống với kho tiền ngân hàng với các hộp ký gửi an toàn: Đôi điều về mảng - 1Một mảng cũng bao gồm các "hộp". Bạn có thể đặt một cái gì đó (một yếu tố) vào mỗi hộp. Để truy cập một phần tử, bạn cần biết số hộp (chỉ mục) của nó. Đây là cách một mảng được tạo ra:

public class Main {

   public static void main(String[] args) {

       String [] birthdays = new String[10];
      
   }
}
Ở đây chúng ta tạo một mảng chứa 10 phần tử. Bạn có thể lưu ý ngay một số tính năng của mảng:
  1. Nó lưu trữ các phần tử của một kiểu dữ liệu được xác định rõ . Nếu chúng ta tạo một mảng Chuỗi, chúng ta không thể lưu trữ bất kỳ thứ gì khác trong đó. Kiểu dữ liệu được chỉ định khi tạo mảng . Đây là điểm khác với hộp ký gửi an toàn (trong đó khách hàng có thể cất giữ những gì họ muốn).

  2. Kích thước của nó phải được chỉ định khi mảng được tạo . Bạn không thể chỉ ra nó sau hoặc thay đổi kích thước của nó sau khi mảng được tạo .
Thực tế là chúng ta đang tạo một mảng được biểu thị bằng dấu ngoặc vuông ở cả hai bên của biểu thức. Chúng có thể được chỉ định trước hoặc sau tên của biến tham chiếu. Dù bằng cách nào cũng sẽ hoạt động:

String [] birthdays = new String[10];
String birthdays [] = new String[10];
Nếu bạn muốn viết một cái gì đó vào một mảng, bạn cần chỉ định chỉ mục của ô mà giá trị sẽ được ghi. Các hộp trong một mảng được đánh số bắt đầu từ 0. Việc đếm bắt đầu từ 0 là một thực tế rất phổ biến trong lập trình. Làm quen càng nhanh càng tốt :) Đôi điều về mảng - 2 Điều này có nghĩa là nếu bạn muốn đặt một giá trị nào đó vào ô đầu tiên , bạn làm như sau:

public class Main {

   public static void main(String[] args) {

       String birthdays [] = new String[10];
       birthdays[0] = "Jana Russell, March 12";
   }
}
Giờ đây, ngày sinh của Jana được lưu trữ trong ô đầu tiên của mảng ngày sinh của nhân viên: Bạn có thể thêm các giá trị khác theo cách tương tự:

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";
   }
}
Lưu ý rằng chúng tôi đã thêm ngày sinh nhật của Rosie vào ô thứ tám (bạn không quên tại sao Ô số 7 lại là ô thứ tám chứ?) . Bạn có thể thấy rằng chúng tôi chưa điền vào tất cả các ô khác. Chúng ta không cần phải viết các giá trị vào một mảng theo thứ tự. Không có yêu cầu như vậy. Tất nhiên, việc viết các phần tử theo thứ tự sẽ giúp bạn dễ dàng theo dõi xem có bao nhiêu hộp trống và bao nhiêu hộp bị chiếm dụng, đồng thời ngăn không cho mảng có "lỗ hổng". Nếu bạn muốn lấy nội dung của một trong các hộp, thì (giống như với hộp ký gửi an toàn), bạn cần biết số của nó. Đây là cách mà nó được hoàn thành:

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);
   }
}
Đầu ra của bảng điều khiển: Rosie Mills, ngày 3 tháng 1 Chúng tôi đã tạo một Stringbiến và nói với trình biên dịch: "Tìm ô có chỉ số 7 trong mảng sinh nhật và gán giá trị chứa trong đó cho biến StringrosieBirthday " . Và đó chính xác là những gì nó đã làm. Khi làm việc với mảng, chúng ta có thể dễ dàng tìm thấy độ dài của chúng bằng một thuộc tính đặc biệt: độ dài .

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);
   }
}
Đầu ra của bảng điều khiển: 10 Lưu ý: lengthThuộc tính lưu trữ kích thước mảng, không phải số hộp đã đầy. Mảng của chúng tôi chỉ lưu trữ 3 giá trị, nhưng chúng tôi đã chỉ ra kích thước của nó là 10 khi chúng tôi tạo nó. Và đây chính xác là giá trị mà lengthtrường trả về. Tại sao điều này sẽ có ích? Chà, giả sử bạn muốn hiển thị danh sách tất cả các ngày sinh nhật (để xác minh rằng không có ai bị quên). Bạn có thể làm điều này trong một vòng lặp đơn giản:

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]);
       }
   }
}
Trong vòng lặp, chúng ta khai báo biến i, được khởi tạo bằng 0. Tại mỗi lần vượt qua, chúng ta lấy phần tử có chỉ số i từ mảng của mình và hiển thị giá trị của nó. Vòng lặp sẽ thực hiện 10 lần lặp và tôi sẽ tăng từ 0 lên 9—và các số tình cờ là chỉ số của các phần tử trong mảng của chúng ta! Kết quả là, chúng tôi sẽ hiển thị tất cả các giá trị từ ngày sinh nhật[0] đến ngày sinh nhật[9] Trên thực tế, có một cách khác để bạn có thể tạo một mảng. Ví dụ: bạn có thể tạo một mảng ints như sau:

public class Main {

   public static void main(String[] args) {
       int numbers [] = {7, 12, 8, 4, 33, 79, 1, 16, 2};
   }
}
Kỹ thuật này được gọi là "khởi tạo phím tắt". Nó khá thuận tiện, bởi vì chúng tôi đồng thời tạo một mảng và điền vào đó các giá trị. Chúng tôi không phải chỉ định rõ ràng kích thước mảng: với khởi tạo phím tắt, trường lengthđược đặt tự động.

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);
   }
}
Đầu ra của bàn điều khiển: 9 Bây giờ, một chút về cách các mảng được lưu trữ trong bộ nhớ. Giả sử chúng ta có một mảng gồm ba Catđối tượng:

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");
   }
}
Bạn cần hiểu một vài điều ở đây:
  1. Trong trường hợp nguyên thủy, một mảng lưu trữ một tập hợp các giá trị cụ thể (ví dụ: ints). Trong trường hợp đối tượng, một mảng lưu trữ một tập hợp các tham chiếu .
    Mảng catsbao gồm ba phần tử, mỗi phần tử là một tham chiếu đến một Catđối tượng. Mỗi tham chiếu trỏ đến địa chỉ bộ nhớ nơi lưu trữ đối tượng tương ứng.

  2. Các phần tử của mảng được sắp xếp trong một khối duy nhất trong bộ nhớ. Điều này được thực hiện để cho phép chúng được truy cập nhanh chóng và hiệu quả.
Do đó, catstham chiếu khối bộ nhớ nơi lưu trữ tất cả các đối tượng (phần tử mảng). Cats[0]tham chiếu đến một địa chỉ cụ thể trong khối này. Đôi điều về mảng - 3 Điều quan trọng là phải hiểu rằng một mảng không chỉ lưu trữ các đối tượng: bản thân nó là một đối tượng. Điều này khiến chúng ta đặt câu hỏi liệu chúng ta có thể tạo không chỉ mảng chuỗi hoặc số mà còn cả mảng mảng . Và câu trả lời là có, chúng ta có thể! Một mảng có thể lưu trữ bất kỳ đối tượng nào, kể cả các mảng khác. Một mảng như vậy được gọi là mảng hai chiều . Nếu chúng ta biểu diễn nó một cách trực quan, nó sẽ rất giống với một cái bàn bình thường. Giả sử, chúng ta muốn tạo một mảng gồm 3 mảng , mỗi mảng có thể lưu trữ 10 ints. Nó sẽ trông như thế này:
Đôi điều về mảng - 4
Mỗi dòng đại diện cho một intmảng. Mảng đầu tiên chứa các số từ 1 đến 10, mảng thứ hai — từ -1 đến -10 và mảng thứ ba — một tập hợp các số ngẫu nhiên. Mỗi mảng này được lưu trữ trong các hộp của mảng hai chiều của chúng ta. Trong mã, việc khởi tạo một mảng hai chiều trông như thế này:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
}
Mèo mảng hai chiều của chúng tôi lưu trữ 3 mảng với 5 hộp trong mỗi mảng. Nếu chúng ta muốn đặt một đối tượng vào ô thứ ba của mảng thứ hai, chúng ta sẽ làm như sau:

public static void main(String[] args) {
   Cat[][] cats = new Cat[3][5];
   cats[1][2] = new Cat("Fluffy");
}
[1]chỉ mảng thứ hai, và [2]chỉ ô thứ ba của mảng đó. Bởi vì một mảng hai chiều bao gồm một số mảng, để lặp qua nó và hiển thị tất cả các giá trị của nó (hoặc điền vào tất cả các phần tử của nó), chúng ta cần một vòng lặp lồng nhau:

for (int i = 0; i < cats.length; i++) {
   for (int j = 0; j < cats[i].length; j++) {
       System.out.println(cats[i][j]);
   }
}
Trong vòng lặp bên ngoài (biến i), chúng tôi lặp lại tất cả các mảng trong mảng hai chiều của chúng tôi. Trong vòng lặp bên trong (biến j), chúng ta chuyển qua tất cả các phần tử của mỗi mảng. Kết quả là, cats[0][0] (mảng đầu tiên, phần tử đầu tiên) sẽ được hiển thị đầu tiên, tiếp theo là cats[0][1] (mảng đầu tiên, phần tử thứ hai). Sau khi xem qua mảng đầu tiên, chúng ta sẽ hiển thị cats[1][0] , cats[1][1] , cats[1][2] , v.v. Nhân tiện, mảng hai chiều cũng hỗ trợ khởi tạo tốc ký:

int[][] numbers = {{1,2,3}, {4,5,6}, {7,8,9}};
Thông thường, chúng ta sẽ khai báo mảng hai chiều numberslà một int[3][3], nhưng cách viết tắt này cho phép chúng ta chỉ định các giá trị ngay lập tức. Tại sao bạn cần một mảng hai chiều? Chà, bạn có thể sử dụng một cái để dễ dàng tạo lại trò chơi "Battleship" nổi tiếng: Đôi điều về mảng - 5 Trong "Battleship", cấu trúc của sân chơi có thể được mô tả dễ dàng: một mảng hai chiều gồm 10 mảng với 10 phần tử mỗi mảng. Bạn tạo hai trong số các mảng này (một cho bạn và một cho đối thủ của bạn)

int[][] battleshipBoard1 = new int[10][10];
int[][] battleshipBoard2 = new int[10][10];
sử dụng một số giá trị (ví dụ: số hoặc ký hiệu) để điền vào các phần tử tương ứng với vị trí tàu của bạn, sau đó thay phiên nhau gọi tọa độ cho các phần tử cụ thể:
  • tàu chiếnBoard1[0][2]!
  • Cô! tàu chiếnBoard2[2][4]!
  • Đánh!
  • tàu chiếnBoard2[2][5]!
  • Đánh!
  • battleshipBoard2[2][6]!,
  • chìm!
Điều này kết thúc phần giới thiệu đầu tiên của chúng ta về mảng, nhưng đó mới chỉ là khởi đầu tương tác của chúng ta với chúng. Trong các bài học sau, chúng ta sẽ thấy những cách thú vị mà chúng có thể được sử dụng, đồng thời tìm hiểu những chức năng tích hợp sẵn của Java để cho phép chúng ta làm việc với cấu trúc dữ liệu này thuận tiện hơn :)
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION