2013-08-01 32 views
12

tôi chỉ có một ý tưởng để thử nghiệm một cái gì đó và nó làm việc:Mảng nhiều chiều với kích cỡ khác nhau

String[][] arr = new String[4][4]; 

    arr[2] = new String[5]; 

    for(int i = 0; i < arr.length; i++) 
    { 
     System.out.println(arr[i].length); 
    } 

Kết quả rõ ràng là:

4 
4 
5 
4 

Vì vậy, câu hỏi của tôi là:

  • Kiểu mã hóa tốt hay xấu này?
  • Điều này có thể tốt cho điều gì?
  • Và trên hết, có cách nào để tạo cấu trúc như vậy trong bản khai báo không?
  • Ngoài ra ... tại sao nó thậm chí có thể làm?
+3

Không có thứ gì như "mảng 2D gốc". Nó luôn luôn là một mảng của mảng. Tôi nghĩ điều đó khá tốt. – MightyPork

+0

Điều này được gọi là mảng răng cưa, tức là mảng mảng. –

+2

Đây thực sự là câu hỏi hay, tôi không hiểu những nhược điểm đó. – MightyPork

Trả lời

16
  • là phong cách này tốt hay xấu của mã hóa?

Giống như mọi thứ, tùy thuộc vào tình huống. Có các tình huống trong đó mảng răng cưa (như chúng được gọi) thực tế là phù hợp.

  • Điều này có thể tốt cho điều gì?

Vâng, để lưu trữ tập hợp dữ liệu có độ dài khác nhau trong một mảng. Ví dụ: nếu chúng tôi có các chuỗi "hello""goodbye", chúng tôi có thể lưu trữ các mảng ký tự của chúng trong một cấu trúc. Các mảng char có độ dài khác nhau, vì vậy chúng tôi sẽ sử dụng một mảng răng cưa.

  • Và trên hết, có cách nào để tạo cấu trúc như vậy trong bản khai báo không?

Có:

char[][] x = {{'h','e','l','l','o'}, 
       {'g','o','o','d','b','y','e'}}; 
  • Ngoài ra ... tại sao nó thậm chí có thể làm gì?

Do được đặc điểm kỹ thuật ngôn ngữ Java cho phép, §10.6.

+1

Câu trả lời hay. Đặc biệt giống như ví dụ của bạn với mảng ký tự. +1 –

9
  1. Đây là kiểu mã hóa tốt, không có gì sai với nó. Tôi đã tự tạo ra các mảng bị lởm chởm cho các vấn đề khác nhau trong quá khứ.

  2. Điều này là tốt vì bạn có thể cần lưu trữ dữ liệu theo cách này. Dữ liệu được lưu trữ theo cách này sẽ cho phép bạn tiết kiệm bộ nhớ. Nó sẽ là một cách tự nhiên để ánh xạ các mục hiệu quả hơn trong các tình huống nhất định.

  3. Trong một dòng đơn lẻ, không điền rõ ràng mảng?Không. Đây là điều gần nhất tôi có thể nghĩ đến.

    int[][] test = new int[10][]; 
    test[0] = new int[100]; 
    test[1] = new int[500]; 
    

    Điều này sẽ cho phép bạn điền các hàng có mảng có độ dài khác nhau. Tôi thích cách tiếp cận này để phổ biến với các giá trị như vậy:

    int[][] test = new int[][]{{1,2,3},{4},{5,6,7}}; 
    

    Bởi vì nó dễ đọc hơn và thực tiễn khi xử lý các mảng rách rưới lớn.

  4. Có thể thực hiện các lý do được đưa ra trong 2. Mọi người có lý do hợp lệ để cần mảng rách rưới, vì vậy những người sáng tạo ngôn ngữ đã cho chúng tôi một cách để làm điều đó.
1

(1) Trong khi không có gì về mặt kỹ thuật/chức năng/cú pháp sai, tôi sẽ nói đó là kiểu mã hóa xấu vì nó phá vỡ giả định được cung cấp bởi khởi tạo đối tượng (String [4] [4]) . Điều này, cuối cùng, tùy thuộc vào sở thích của người dùng; nếu bạn là người duy nhất đọc nó, và bạn biết chính xác những gì bạn đang làm, nó sẽ ổn thôi. Nếu người khác chia sẻ/sử dụng mã của bạn, nó sẽ làm tăng thêm sự nhầm lẫn.

(2) Khái niệm duy nhất tôi có thể nghĩ là nếu bạn có nhiều mảng để đọc, nhưng không biết kích thước của chúng trước đó. Tuy nhiên, nó sẽ có ý nghĩa hơn để sử dụng ArrayList<String> trong trường hợp đó, trừ khi chi phí bổ sung là một vấn đề nghiêm trọng.

(3) Tôi không chắc bạn đang hỏi gì về điều này. Bạn có nghĩa là, bạn có thể bằng cách nào đó xác định độ dài mảng cá nhân trong tuyên bố ban đầu đó? Câu trả lời cho điều này là không.

(4) Có thể mở rộng và thu nhỏ độ dài mảng nguyên thủy vì đằng sau hậu trường, bạn chỉ phân bổ và giải phóng khối bộ nhớ.

Các vấn đề liên quan