2010-10-22 23 views
72

Ho bisogno di ottenere la lunghezza di un array 2D sia per la riga che per la colonna. L'ho eseguito correttamente utilizzando il seguente codice:Ottenere la lunghezza dell'array di un array 2D in Java

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

Stampa 5, 10 come previsto.

Ora un'occhiata a questa linea:

int col = test[0].length; 

Si noti che ho effettivamente fare riferimento a una riga particolare, al fine di ottenere la lunghezza della colonna. Per me, questo sembra incredibilmente brutto. Inoltre, se la matrice è stata definita come:

test = new int[0][10]; 

Quindi il codice non riuscirebbe nel tentativo di ottenere la lunghezza. C'è un modo diverso (più intelligente) per farlo?

risposta

97

consideri

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 
} 

lunghezze di colonna differiscono per riga. Se stai supportando alcuni dati con una matrice 2D di dimensioni fisse, quindi fornisci i getter ai valori fissi in una classe wrapper.

+0

Domanda non correlata sulla tua risposta. Qual è la tecnica/metodo chiamato dove inserisci "{...};" dopo la definizione dell'oggetto. Come nuovo sviluppatore continuo a vederlo sempre di più. – user432209

+0

Beh, ho capito molto :). Ho solo pensato che potesse esserci un nome specifico per la tecnica. – user432209

+0

Non sai quale sia il suo nome - inizializzazione dell'oggetto? inizializzazione in linea? uno dei nostri Guru Java saprà –

4

Java consente di creare "array frammentati" in cui ogni "riga" ha lunghezze diverse. Se sai di avere una matrice quadrata, è possibile utilizzare il codice modificato per proteggere da un array vuoto come questo:

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

Non c'è un modo più pulito a livello di lingua, perché non tutti gli array multidimensionali sono rettangolari. A volte sono necessarie matrici frastagliate (lunghezze differenti delle colonne).

Si potrebbe facilmente creare la propria classe per astrarre le funzionalità necessarie.

Se non si è limitati agli array, allora forse alcune delle varie classi di raccolta funzionerebbero anche come Multimap.

10

Un array 2D non è una griglia rettangolare. O forse meglio, non esiste un array 2D in 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)); 
    } 
} 

uscite

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

Gli array test e test2 sono (più o meno) lo stesso.

1

Prova questa seguente programma per matrice 2D in 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
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

questo non è correlato alla domanda –

0

Se si dispone di questa matrice:

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

Si può fare questo:

example.length; 

= 2

example[0].length; 

= 2

example[1].length; 

= 2

example[0][1].length; 

= 3

example[1][0].length; 

= 4

+0

Ho visto una risposta simile prima ma penso che sia più facile da capire con gli esempi! – Andy