Lấy độ dài mảng của mảng 2D trong Java


129

Tôi cần lấy chiều dài của mảng 2D cho cả hàng và cột. Tôi đã thực hiện thành công việc này, sử dụng mã sau:

public class MyClass {

 public static void main(String args[])
    {
  int[][] test; 
  test = new int[5][10];

  int row = test.length;
  int col = test[0].length;

  System.out.println(row);
  System.out.println(col);
    }
}

Điều này in ra 5, 10 như mong đợi.

Bây giờ hãy xem dòng này:

  int col = test[0].length;

Lưu ý rằng tôi thực sự phải tham chiếu một hàng cụ thể, để có được chiều dài cột. Đối với tôi, điều này dường như vô cùng xấu xí. Ngoài ra, nếu mảng được định nghĩa là:

test = new int[0][10];

Sau đó, mã sẽ thất bại khi cố gắng để có được chiều dài. Có một cách khác (thông minh hơn) để làm điều này?


Tôi tìm thấy tài liệu tham khảo sau đây khá toàn diện, programiz.com/java-programming/multidimensional-array
Hossein Rahimi

Câu trả lời:


182

Xem xét

public static void main(String[] args) {

    int[][] foo = new int[][] {
        new int[] { 1, 2, 3 },
        new int[] { 1, 2, 3, 4},
    };

    System.out.println(foo.length); //2
    System.out.println(foo[0].length); //3
    System.out.println(foo[1].length); //4
}

Độ dài cột khác nhau trên mỗi hàng. Nếu bạn đang sao lưu một số dữ liệu bằng một mảng 2D có kích thước cố định, thì hãy cung cấp getters cho các giá trị cố định trong một lớp bao bọc.


1
Câu hỏi không liên quan về câu trả lời của bạn. Kỹ thuật / phương pháp được gọi là nơi bạn đặt "{...};" sau khi định nghĩa đối tượng. Là một nhà phát triển mới, tôi tiếp tục thấy điều này ngày càng nhiều.
user432209

Chà, tôi hiểu điều đó lắm :). Tôi chỉ nghĩ rằng có thể có một tên cụ thể cho kỹ thuật.
user432209

Không chắc tên của nó là gì - khởi tạo đối tượng? khởi tạo nội tuyến? một trong những Gurus Java của chúng tôi sẽ biết
NG.

8
Theo JLS 10.6 và 15.10, phần dấu ngoặc nhọn chỉ đơn giản là Bộ khởi tạo mảng, trong khi toàn bộ bắt đầu bằng mới là Biểu thức tạo mảng.
ILMTitan

17

Một mảng 2D không phải là một lưới hình chữ nhật. Hoặc có thể tốt hơn, không có thứ gọi là mảng 2D trong Java.

import java.util.Arrays;

public class Main {
  public static void main(String args[]) {

    int[][] test; 
    test = new int[5][];//'2D array'
    for (int i=0;i<test.length;i++)
      test[i] = new int[i];

    System.out.println(Arrays.deepToString(test));

    Object[] test2; 
    test2 = new Object[5];//array of objects
    for (int i=0;i<test2.length;i++)
      test2[i] = new int[i];//array is a object too

    System.out.println(Arrays.deepToString(test2));
  }
}

Đầu ra

[[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]
[[], [0], [0, 0], [0, 0, 0], [0, 0, 0, 0]]

Các mảng testtest2là (nhiều hay ít) giống nhau.


12

Thật sự rất khó để nhớ rằng

    int numberOfColumns = arr.length;
    int numberOfRows = arr[0].length;

Chúng ta hãy hiểu tại sao lại như vậy và làm thế nào chúng ta có thể tìm ra điều này khi chúng ta gặp vấn đề về mảng. Từ đoạn mã dưới đây, chúng ta có thể thấy rằng hàng = 4 và cột = 3:

    int[][] arr = { {1, 1, 1, 1}, 

                    {2, 2, 2, 2}, 

                    {3, 3, 3, 3} };

arrcó nhiều mảng trong đó và các mảng này có thể được sắp xếp theo chiều dọc để lấy số lượng cột. Để có được số lượng hàng, chúng ta cần truy cập vào mảng đầu tiên và xem xét độ dài của nó. Trong trường hợp này, chúng tôi truy cập [1, 1, 1, 1] và do đó, số lượng hàng = 4. Khi bạn gặp sự cố khi bạn không thể nhìn thấy mảng, bạn có thể hình dung mảng dưới dạng hình chữ nhật với n X m kích thước và kết luận rằng chúng ta có thể nhận được số lượng hàng bằng cách truy cập vào mảng đầu tiên sau đó là chiều dài của nó. Một cái khác ( arr.length) là cho các cột.


8
Bạn có điều này ngược. "Trong trường hợp này, chúng tôi truy cập [1, 1, 1, 1] và do đó, số lượng hàng = 4." Trên thực tế, điều đó có nghĩa là có 4 cột.
Evan Rosica

Đúng @Evan Rosica
Nitin Nanda

5

Java cho phép bạn tạo ra "mảng rách rưới" trong đó mỗi "hàng" có độ dài khác nhau. Nếu bạn biết bạn có một mảng vuông, bạn có thể sử dụng mã của mình được sửa đổi để bảo vệ chống lại một mảng trống như thế này:

if (row > 0) col = test[0].length;

4

Nếu bạn có mảng này:

String [][] example = {{{"Please!", "Thanks"}, {"Hello!", "Hey", "Hi!"}},
                       {{"Why?", "Where?", "When?", "Who?"}, {"Yes!"}}};

Bạn có thể làm được việc này:

example.length;

= 2

example[0].length;

= 2

example[1].length;

= 2

example[0][1].length;

= 3

example[1][0].length;

= 4


Tôi đã thấy một câu trả lời tương tự trước đây nhưng tôi nghĩ nó dễ hiểu hơn với các ví dụ!

3

Không có cách nào sạch hơn ở cấp độ ngôn ngữ vì không phải tất cả các mảng đa chiều đều là hình chữ nhật. Đôi khi các mảng răng cưa (độ dài cột khác nhau) là cần thiết.

Bạn có thể dễ dàng tạo lớp riêng của mình để trừu tượng hóa chức năng bạn cần.

Nếu bạn không giới hạn trong mảng, thì có lẽ một số lớp bộ sưu tập khác nhau cũng sẽ hoạt động, như Multimap .


1

.length = số lượng hàng / chiều dài cột

[0] .length = số lượng cột / chiều dài hàng


1
Chào mừng đến với SO. Bạn nên thêm một số giải thích cho câu trả lời của bạn.
m02ph3u5

0

Hãy thử chương trình sau đây cho mảng 2d trong java:

public class ArrayTwo2 {
    public static void main(String[] args) throws  IOException,NumberFormatException{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int[][] a;
        int sum=0;
        a=new int[3][2];
        System.out.println("Enter array with 5 elements");
        for(int i=0;i<a.length;i++)
        {
            for(int j=0;j<a[0].length;j++)
            {
            a[i][j]=Integer.parseInt(br.readLine());
            }
        }
        for(int i=0;i<a.length;i++)
        {
            for(int j=0;j<a[0].length;j++)
            {
            System.out.print(a[i][j]+"  ");
            sum=sum+a[i][j];
            }
        System.out.println();   
        //System.out.println("Array Sum: "+sum);
        sum=0;
        }
    }
}

0
import java.util.Arrays;

public class Main {

    public static void main(String[] args) 
    {

        double[][] test = { {100}, {200}, {300}, {400}, {500}, {600}, {700}, {800}, {900}, {1000}};

        int [][] removeRow = { {0}, {1}, {3}, {4}, };

        double[][] newTest = new double[test.length - removeRow.length][test[0].length];

        for (int i = 0, j = 0, k = 0; i < test.length; i++) {
            if (j < removeRow.length) {
                if (i == removeRow[j][0]) {
                    j++;
                    continue;
                }
            }
            newTest[k][0] = test[i][0];
            k++;
        }

        System.out.println(Arrays.deepToString(newTest));   
    }
}

Sẽ in [[300.0], [600.0], [700.0], [800.0], [900.0], [1000.0]] chuyển đổi sang ints để mất dấu thập phân. Giải pháp này giả định mảng đầu vào của bạn sẽ luôn có kích thước ([x] [1])
RobynVG

0

Với Java 8, cho phép bạn làm một cái gì đó thanh lịch hơn như thế này:

int[][] foo = new int[][] {
        new int[] { 1, 2, 3 },
        new int[] { 1, 2, 3, 4},
    };

int length = Arrays.stream(array).max(Comparator.comparingInt(ArrayUtils::getLength)).get().length

-2
public class Array_2D {
int arr[][];
public Array_2D() {
    Random r=new Random(10);
     arr = new int[5][10];
     for(int i=0;i<5;i++)
     {
         for(int j=0;j<10;j++)
         {
             arr[i][j]=(int)r.nextInt(10);
         }
     }
 }
  public void display()
  {
         for(int i=0;i<5;i++)

         {
             for(int j=0;j<10;j++)
             {
                 System.out.print(arr[i][j]+" "); 
             }
             System.out.println("");
         }
   }
     public static void main(String[] args) {
     Array_2D s=new Array_2D();
     s.display();
   }  
  }

1
điều này không liên quan đến câu hỏi
alfonso.kim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.