Tablice w Javie.
tablice jednowymiarowe
z elementami typu prostego
definicja zmiennej tablicowej :
int[] tab; // nie tworzy tablicy, a tylko zmienną referencyjną (tablica jest traktowana jako obiekt, tylko nie ma określonej nazwy klasy).
tworzenie tablicy o liczbie elementów "n" :
tab = new int[n];
lub int[] tab = new int[n];
lub int [] tab= {1,2,3,4,5};
odwołanie do elementu tablicy :
tab[i] // wyrażenie indeksowe musi mieć wartość od 0 do liczba elementów-1
Uwaga : jeśli tablica nie jest wykorzystana w pełni musimy pamiętać liczbę zapisanych elementów, w przypadku pełnej tablicy możemy wykorzystać atrybut length ( tab.length).
Przetwarzanie tablic :
- typowa pętla przechodząca przez wszystkie elementy tablicy na przykładzie obliczania sumy wartości elementów tablicy :
int sumaElementów()
{ int suma=0;
for(int i=0; i<n; i++)
suma+=tab[i];
return suma; }
- wyszukiwanie elementu w tablicy ( przykład pętli która może się kończyć wcześniej )
boolean jest( int szukany)
{ int i=0;
while ( i<n && a[i]!=szzukany) // ważna kolejność warunków
i++;
return i<n; // nie a[i]==szukany
}
Uwaga: ta porządna strukturalna wersja wcale nie jest bardziej złożona od wersji niestrukturalnej ( czytaj nieporządnej ) - niestety często spotykanej w książkach :
boolean jest( int szukany)
{ for(int i=0; i<n ;i++)
if(a[i]== szukany ) return true;
return false;
}
- sprawdzanie różnowartościowości tablicy ( przykład na to, że nie zawsze wystarczy pojedyncza pętla do przetworzenia tablicy jednowymiarowej) :
boolean roznowartosciowa( )
{ boolean jest = true; // jest różnowartościowa
for( int i =0 && jest ; i< n; i++)
for( int j=i+1; j < n && jest ; j++)
jest=a[i] != a[j];
return jest;
}
z elementami klasowymi
załóżmy, że mamy klasę : class Osoba { String nazwisko; ...........};
definicja zmiennej tablicowej :
Osoba [ ] tab;
definicja tablicy n- elementowej :
Osoba [ ] tab = new Osoba[n] ; // tworzy tylko tablicę pustych ( null) referencji
tworzenie n elementowej tablicy wypełnionej pustymi obiektami :
Osoba [ ] tab = new Osoba[n] ;
for(int i =0; i < n ; i++)
tab[i]=new Osoba();
przetwarzanie tablicy :
a. jeśli elementy są dopisywane kolejno ( bez żadnych dziur ) - np. osoby zapisane na wycieczkę :
int ileOsob( )
{ int i=0;
while( tab[i++]!= null ) ; // typowy skrócony zapis to : while(tab[i++]);
return i;
}
b. jeśli elementy są dopisywane na wybrane pozycje ( mogą być przerwy ) - np. kino z numerowanymi miejscami, ale bez wyróżnionych rzędów :
int ileOsob( )
{ ile=0;
for(int i=0; i< tab.length; i++)
if(tab[i]!=null) ile++;
return ile;
}
B. tablice dwuwymiarowe
regularne ( macierze)
definicja zmiennej tablicowej :
int [ ] [ ] mac;
definicja macierzy o m wierszach i n kolumnach :
int [ ] [ ] mac= new [ m] [n] ;
odwołania :
mac - cała macierz
mac[i] - i-ty wiersz macierzy
mac[i][j] - j-ty element i-tego wiersza , czyli element ai,j
przykład przetwarzania ( typowa podwójna pętla ) :
int suma Elementow( )
{ int suma=0;
for( int i=0; i<m; i++ )
for( int j=0; j<n; j++ )
suma+=mac[i][j];
return suma;
}
Żeby się przekonąć, że nie zawsze wystarczy podwójna pętla wystarczy spróbować zapisać metodę sprawdzającą różnowartościowość macierzy.
nieregularne ( o wierszach różnej długości)
tworzenie tablicy na przykładzie szkoły w której każda klasa ma inny limit uczniów (zapisany w tablicy klasa) :
int[ ] klasa ={ .......};
Osoba [ ][ ] szkola = new Osoba[klasa.length][ ] ;
for( int i=0; i< klasa.length; i++ )
szkola[i]=new Osoba[klasa[i]];