Получение длины массива 2D-массива в Java

129

Мне нужно получить длину 2D-массива как для строки, так и для столбца. Я успешно сделал это, используя следующий код:

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];

Тогда код не удастся получить длину. Есть ли другой (более разумный) способ сделать это?

user432209
источник
Я нашел следующую ссылку довольно всеобъемлющей, programiz.com/java-programming/multidimensional-array
Хоссейн Рахими

Ответы:

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
}

Длина столбца зависит от строки. Если вы подкрепляете некоторые данные двумерным массивом фиксированного размера, предоставьте методы получения фиксированных значений в классе-оболочке.

NG.
источник
1
Не связанный с вашим ответом вопрос. Какая техника / метод называется, когда вы помещаете "{...};" после определения объекта. Как новый разработчик, я вижу это все чаще и чаще.
user432209
Что ж, я это прекрасно понимаю :). Я просто подумал, что у этой техники может быть конкретное название.
user432209
Не знаете, как это называется - инициализация объекта? встроенная инициализация? один из наших Java-гуру будет знать
NG.
8
Согласно JLS 10.6 и 15.10 часть фигурных скобок - это просто инициализатор массива, а все, что начинается с new, - это выражение создания массива.
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) предназначен для столбцов.

gocode
источник
8
У вас это наоборот. «В этом случае мы получаем доступ к [1, 1, 1, 1] и, таким образом, количество строк = 4.» Фактически это означает, что есть 4 столбца.
Эван
Правильный @Evan Rosica
Нитин Нанда
5

Java позволяет создавать «рваные массивы», где каждая «строка» имеет разную длину. Если вы знаете, что у вас есть квадратный массив, вы можете использовать свой код, модифицированный для защиты от пустого массива, например:

if (row > 0) col = test[0].length;
robert_x44
источник
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 .

kaliatech
источник
1

.length = количество строк / длина столбца

[0] .length = количество столбцов / длина строки

asdfgghjkll
источник
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));   
    }
}
RobynVG
источник
Напечатает [[300.0], [600.0], [700.0], [800.0], [900.0], [1000.0]] преобразовать в целые числа, чтобы потерять десятичную точку. Это решение предполагает, что ваш входной массив всегда будет иметь размер ([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
logbasex
источник
-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