2013-08-01 18 views
12

Właśnie wpadł na pomysł, aby przetestować coś i to działało:Tablice wielowymiarowe o różnych rozmiarach

String[][] arr = new String[4][4]; 

    arr[2] = new String[5]; 

    for(int i = 0; i < arr.length; i++) 
    { 
     System.out.println(arr[i].length); 
    } 

Wyjście oczywiście brzmi:

4 
4 
5 
4 

Więc moje pytania to:

  • Czy to dobry czy zły styl kodowania?
  • Po co to może być dobre?
  • A przede wszystkim czy istnieje sposób na stworzenie takiej konstrukcji w samej deklaracji?
  • Również ... dlaczego można to zrobić?
+3

Nie ma czegoś takiego jak "natywna tablica 2D". To zawsze Array of Arrays. Myślę, że to wyjaśnia całkiem dobrze. – MightyPork

+0

Nazywa się to postrzępionymi tablicami, np. Tablicami tablic. –

+2

To właściwie dobre pytanie, nie rozumiem tych pochlebstw, które dostał. – MightyPork

Odpowiedz

16
  • Czy to dobry czy zły styl kodowania?

Jak coś, to zależy od sytuacji. Istnieją sytuacje, w których poszarpane tablice (jak się je nazywa) są w rzeczywistości odpowiednie.

  • Po co to może być dobre?

Cóż, do przechowywania zestawów danych o różnych długościach w jednej tablicy. Na przykład, jeśli mamy ciągi znaków "hello" i "goodbye", możemy chcieć przechowywać ich tablice znaków w jednej strukturze. Te macierze char mają różne długości, więc użylibyśmy poszarpanej tablicy.

  • A przede wszystkim, czy jest jakiś sposób, aby stworzyć taką konstrukcję w samej deklaracji?

Tak:

char[][] x = {{'h','e','l','l','o'}, 
       {'g','o','o','d','b','y','e'}}; 
  • także ... dlaczego jest to w ogóle możliwe do zrobienia?

Ponieważ jest to dozwolone przez specyfikację języka Java, §10.6.

+1

Dobra odpowiedź. Szczególnie jak twój przykład z tablicami znaków. +1 –

9
  1. To jest świetny styl kodowania, nie ma w tym nic złego. W przeszłości tworzyłem postrzępione tablice dla różnych problemów.

  2. Jest to dobre, ponieważ może być konieczne przechowywanie danych w ten sposób. Dane przechowywane w ten sposób pozwolą na zaoszczędzenie pamięci. Byłby to naturalny sposób na bardziej efektywne odwzorowywanie elementów w niektórych scenariuszach.

  3. W pojedynczej linii bez jawnego wypełniania tablicy?Nie. To jest najbliższa rzecz, o której mogę myśleć.

    int[][] test = new int[10][]; 
    test[0] = new int[100]; 
    test[1] = new int[500]; 
    

    Umożliwi to wypełnienie rzędów tablicami o różnych długościach. Wolę to podejście do wypełniania wartościami tak:

    int[][] test = new int[][]{{1,2,3},{4},{5,6,7}}; 
    

    ponieważ jest bardziej czytelny i praktyczny wpisać gdy mamy do czynienia z dużymi poszarpanych tablic.

  4. Jest to możliwe z powodów podanych w 2. Ludzie mają uzasadnione powody, dla których potrzebowali nierównych tablic, więc twórcy języka dali nam sposób na zrobienie tego.
1

(1) Chociaż nic nie jest technicznie/funkcjonalnie/syntaktycznie nie tak z nim, powiedziałbym, że jest to zły styl kodowania, ponieważ przerywa założenie zapewnione przez inicjalizację obiektu (String [4] [4]) . Ostatecznie zależy to od preferencji użytkownika; jeśli tylko ty to czytasz i wiesz dokładnie, co robisz, byłoby dobrze. Jeśli inne osoby udostępniają/używają Twój kod, zwiększa to zamieszanie.

(2) Jedyne pojęcie, o jakim mogłem pomyśleć, to to, czy masz wiele tablic do odczytania, ale nie wiesz wcześniej ich wielkości. Jednak w tym przypadku bardziej sensowne byłoby użycie ArrayList<String>, chyba że dodatkowe obciążenie było poważnym problemem.

(3) Nie jestem pewien, o co tu chodzi. Czy masz na myśli, czy możesz w jakiś sposób określić poszczególne długości tablicy w tej początkowej deklaracji? Odpowiedź brzmi: nie.

(4) Możliwe jest przedłużanie i zmniejszanie prymitywnych długości macierzy, ponieważ za kulisami alokujesz i zwalniasz fragmenty pamięci.

Powiązane problemy