Отримання довжини масиву двовимірного масиву в Java


129

Мені потрібно отримати довжину двовимірного масиву і для рядка, і для стовпця. Я успішно зробив це, використовуючи наступний код:

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);
    }
}

Це видає 5, 10, як очікувалося.

Тепер подивіться на цей рядок:

  int col = test[0].length;

Зауважте, що я фактично повинен посилатися на певний рядок, щоб отримати довжину стовпця. Мені це здається неймовірно некрасивим. Крім того, якщо масив був визначений як:

test = new int[0][10];

Тоді код не вдасться при спробі отримати довжину. Чи є інший (розумніший) спосіб зробити це?


Відповіді:


182

Розглянемо

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
}

Довжини стовпців різняться в ряд. Якщо ви створюєте резервну копію деяких даних за допомогою 2D-масиву фіксованого розміру, тоді надайте гетерам фіксовані значення класу обгортки.


1
Непов’язане запитання щодо вашої відповіді. Як називається техніка / метод, куди ви кладете "{...};" після визначення об’єкта. Як новий розробник я все більше і більше бачу це.
user432209

Ну, я так багато розумію :). Я просто думав, що може бути певна назва для техніки.
user432209

Не знаєте, що це за ім’я - ініціалізація об'єкта? вбудована ініціалізація? один з наших Java-гуру буде знати
NG.

8
Згідно JLS 10.6 та 15.10, фігурна дужка - це просто ініціалізатор масиву, тоді як справа починається з нового - це вираз створення масиву масиву.
ILMTitan

17

2D масив - це не прямокутна сітка. А може, ще краще, у Java немає такого поняття, як 2D масив.

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));
  }
}

Виходи

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

Масиви testі test2є (більш-менш) однаковими.


12

Це було дуже важко згадати

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

Давайте розберемося, чому це так, і як ми можемо це з'ясувати, коли нам задають проблему з масивом. З наведеного нижче коду ми бачимо, що рядки = 4 та стовпці = 3:

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

                    {2, 2, 2, 2}, 

                    {3, 3, 3, 3} };

arrв ній є кілька масивів, і ці масиви можуть бути розташовані вертикально, щоб отримати кількість стовпців. Щоб отримати кількість рядків, нам потрібно отримати доступ до першого масиву і врахувати його довжину. У цьому випадку ми отримуємо доступ до [1, 1, 1, 1] і, таким чином, кількість рядків = 4. Коли вам задається проблема, коли ви не можете бачити масив, ви можете візуалізувати масив як прямокутник з n X m розмірів і зробимо висновок, що ми можемо отримати кількість рядків, отримавши доступ до першого масиву, а потім його довжини. Інший ( arr.length) призначений для стовпців.


8
Ви маєте це назад. "У цьому випадку ми отримуємо доступ [1, 1, 1, 1] і, таким чином, кількість рядків = 4." Насправді це означає, що є 4 колонки.
Evan Rosica

Правильний @Evan Rosica
Нітін Нанда

5

Java дозволяє створювати "рвані масиви", де кожен "рядок" має різну довжину. Якщо ви знаєте, що у вас є квадратний масив, ви можете використовувати свій модифікований код для захисту від порожнього масиву на зразок цього:

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

4

Якщо у вас є цей масив:

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

Ви можете зробити це:

example.length;

= 2

example[0].length;

= 2

example[1].length;

= 2

example[0][1].length;

= 3

example[1][0].length;

= 4


Раніше я бачив подібну відповідь, але думаю, що це легше зрозуміти на прикладах!

3

На мовному рівні не існує більш чистого способу, оскільки не всі багатовимірні масиви є прямокутними. Іноді необхідні нерівні (різні довжини стовпців) масиви.

Ви можете легко створити свій власний клас, щоб абстрагувати необхідну функціональність.

Якщо ви не обмежуєтесь масивами, можливо, деякі з різних колекційних класів також працюватимуть, як, наприклад, Multimap .


1

.length = кількість рядків / довжина стовпця

[0] .length = кількість стовпців / довжина рядка


1
Ласкаво просимо до SO. Додайте ще одне пояснення до своєї відповіді.
m02ph3u5

0

Спробуйте наступну програму для 2d масиву в 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));   
    }
}

Буде надруковано [[300.0], [600.0], [700.0], [800.0], [900.0], [1000.0]] перетворення в ints, щоб втратити десяткову точку. Це рішення передбачає, що ваш вхідний масив завжди буде розміром ([x] [1])
RobynVG

0

З Java 8, дозвольте зробити щось більш елегантне, як це:

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
це не пов’язано з питанням
alfonso.kim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.