Obtendo o comprimento de uma matriz 2D em Java

129

Preciso obter o comprimento de uma matriz 2D para a linha e a coluna. Fiz isso com sucesso, usando o seguinte código:

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

Isso imprime 5, 10 conforme o esperado.

Agora dê uma olhada nesta linha:

  int col = test[0].length;

Observe que eu realmente preciso fazer referência a uma linha específica para obter o comprimento da coluna. Para mim, isso parece incrivelmente feio. Além disso, se a matriz foi definida como:

test = new int[0][10];

Em seguida, o código falharia ao tentar obter o comprimento. Existe uma maneira diferente (mais inteligente) de fazer isso?

user432209
fonte
Eu encontrei a seguinte referência bastante abrangente, programiz.com/java-programming/multidimensional-array
Hossein Rahimi

Respostas:

182

Considerar

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
}

Os comprimentos das colunas diferem por linha. Se você estiver fazendo backup de alguns dados por uma matriz 2D de tamanho fixo, forneça getters aos valores fixos em uma classe de wrapper.

NG.
fonte
1
Pergunta não relacionada sobre sua resposta. Qual é a técnica / método chamado onde você coloca "{...};" após a definição do objeto. Como novo desenvolvedor, continuo vendo isso cada vez mais.
user432209
Bem, eu entendo muito isso :). Eu apenas pensei que poderia haver um nome específico para a técnica.
user432209
Não sabe qual é o nome dele - inicialização do objeto? inicialização em linha? um dos nossos Java Gurus saberá
NG.
8
De acordo com o JLS 10.6 e 15.10, a parte de chaves é simplesmente um Inicializador de Matrizes, enquanto tudo que começa com novo é uma Expressão de Criação de Matrizes.
ILMTitan
17

Uma matriz 2D não é uma grade retangular. Ou talvez melhor, não existe uma matriz 2D em 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));
  }
}

Saídas

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

As matrizes teste test2são (mais ou menos) as mesmas.

Ishtar
fonte
12

Foi muito difícil lembrar que

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

Vamos entender por que isso é assim e como podemos descobrir isso quando tivermos um problema de matriz. No código abaixo, podemos ver que linhas = 4 e colunas = 3:

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

                    {2, 2, 2, 2}, 

                    {3, 3, 3, 3} };

arrpossui várias matrizes e essas matrizes podem ser organizadas de maneira vertical para obter o número de colunas. Para obter o número de linhas, precisamos acessar a primeira matriz e considerar seu comprimento. Nesse caso, acessamos [1, 1, 1, 1] e, portanto, o número de linhas = 4. Quando você recebe um problema em que não pode ver a matriz, pode visualizar a matriz como um retângulo com n X m dimensões e concluímos que podemos obter o número de linhas acessando a primeira matriz e depois o seu comprimento. O outro ( arr.length) é para as colunas.

gocode
fonte
8
Você tem isso ao contrário. "Nesse caso, acessamos [1, 1, 1, 1] e, portanto, o número de linhas = 4." Na verdade, isso significa que existem 4 colunas.
Evan Rosica
Correct @Evan Rosica
Nitin Nanda
5

Java permite criar "matrizes irregulares" em que cada "linha" possui comprimentos diferentes. Se você sabe que possui uma matriz quadrada, pode usar seu código modificado para proteger contra uma matriz vazia como esta:

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

Se você possui esta matriz:

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

Você consegue fazer isso:

example.length;

= 2

example[0].length;

= 2

example[1].length;

= 2

example[0][1].length;

= 3

example[1][0].length;

= 4


fonte
Vi uma resposta semelhante antes, mas acho que é mais fácil entender com exemplos!
3

Não há uma maneira mais limpa no nível do idioma, porque nem todas as matrizes multidimensionais são retangulares. Às vezes, são necessárias matrizes irregulares (diferentes comprimentos de coluna).

Você pode criar facilmente sua própria classe para abstrair a funcionalidade necessária.

Se você não estiver limitado a matrizes, talvez algumas das várias classes de coleção funcionem também, como um Multimap .

kaliatech
fonte
1

.length = número de linhas / comprimento da coluna

[0] .length = número de colunas / comprimento da linha

asdfgghjkll
fonte
1
Bem-vindo ao SO. Você deve adicionar mais explicações à sua resposta.
M02ph3u5 16/05/19
0

Tente este programa a seguir para a matriz 2d em 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;
        }
    }
}
Pampanagouda Karmanchi
fonte
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
fonte
Imprimirá [[300.0], [600.0], [700.0], [800.0], [900.0], [1000.0]] convertido em ints para perder o ponto decimal. Esta solução assume que sua matriz de entrada sempre será do tamanho ([x] [1]) #
RobynVG 11/11/18
0

Com Java 8, permita que você faça algo mais elegante como este:

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
fonte
-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();
   }  
  }
Peter
fonte
1
este não está relacionado com a questão
alfonso.kim