160 likes | 449 Views
Java – Tablouri si siruri. Tablouri descriere creare unidimensional de primitive multidimensional de primitive unidimensional de obiecte Siruri creare utilizare. Tablouri. tabloul este o colectie de elemente de acelaşi tip stocate pe heap (locul in care exista toate obiectele Java);
E N D
Java – Tablouri si siruri Tablouri descriere creare unidimensional de primitive multidimensional de primitive unidimensional de obiecte Siruri creare utilizare
Tablouri • tabloul este o colectie de elemente de acelaşi tip stocate pe heap (locul in care exista toate obiectele Java); • tipul elementelor poate fi simplu (primitiv) sau obiect; un element poate stoca o singura valoare; • elementelese identifica unic printr-un numar întreg numit indice; • se zice că un tablou este multidimensional dacă foloseşte mai mulţi indici pentru accesarea unui element de tablou; un tablou cu o singură dimensiune este cunoscut sub numele de "vector", iar unul cu două dimensiuni sub denumirea de "matrice". • numarul de elemente de tablou se fixeaza în momentul crearii acestuia (Java trebuie sa stie cat spatiu sa aloce pe heap);
Tablouri - creare • termenii de constructie, creare sau instantiere a tabloului se refera la stocarea tabloului pe heap; • declararea tabloului se face prin specificarea tipului elementelor, urmate de [] si numele tabloului, de exemplu: int [] a; aceasta linie insa nu aloca si spatiul de stocare pe heap; • crearea tabloului se face folosind operatorul new impreuna cu tipul si numarul de elemente: int [] a = new int[10]; se poate scrie in aceeasi linie cu declararea sau, separat, pe o linie urmatoare; • initializarea elementelor se face automat cu valori implicite (0 pentru tipurile numerice sau echivalent cu 0 pentru cele ne-numerice); initializarea cu valori ne-implicite se face prin enumerarea lor intre acolade, caz in care numarul de elemente se deduce din acolade.
Tablouri unidimesionale - prelucrare Elementele sunt numerotate de la 0 la 9. O metode de initializare a elementelor de tablou este ciclul for. int [] a = new int[10]; for(int i=0;i<10;++i) a[i]=i; Numarul elementelor este fixat si se poate gasi cu nume.length. for (int i = 0; i < a.length; ++i) System.out.println(a[i]); Parcurgerea se poate realiza si cu o constructie de limbaj mai noua in care nu este nevoie de indice. Variabila element din ciclu parcurge automat toata colectia de valori din tabloul a. for (int element:a) System.out.println(element);
Tablouri bidimesionale - creare • un tablou multidimensional este un tablou de tablouri; • pentru accesarea elementelor de folosesc mai multi indici; • declararea si crearea unui tablou cu 2 dimensiuni ([rand][coloana]): • initializare: • declarare şi initializare fara specificarea numarului de coloane (variabil): tip [][] numetablou = new tip[r][c]; int [][] a = new int[4][2]; a[0][0] = 1; a[0][1]=3; int[][] a ={ {1,3}, {0,0}, {0,0}, {0,0} }; tip [][] numetablou = new tip[r][]; … numetablou[il] = new tip[c];
Tablouri bidimesionale - prelucrare Initializare. double [][] m = new double[5][7]; for (int r = 0; r < 5; ++r) for (int c = 0; c < 7; ++c) m[r][c] = r+c; Afisare cu metoda 1. for (int r = 0; r < m.length; ++r) { for (int c = 0; c <m[r].length; ++c) System.out.printf("%10.5f ",m[r][c]); System.out.println(); } Afisare cu metoda 2. for (double [] rand: m) { for (double element: rand) System.out.printf("%10.5f ", element); System.out.println(); }
Tablouri bidimesionale – cu numar variabil de coloane public class TabMulti { public static void main(String[] args) { int k = 0; int tab2d [][] = new int [4][]; //4 randuri tab2d[0] = new int[5]; tab2d[1] = new int[2]; tab2d[2] = new int[4]; tab2d[3] = new int[7]; for(int i=0; i < tab2d.length; ++i) for(int j=0; j < tab2d[i].length; ++j) tab2d[i][j] = k++; for(int i=0; i < tab2d.length; ++i) { for(int j=0; j < tab2d[i].length; ++j) System.out.print(tab2d[i][j]+" "); System.out.println(); } } }
Tablouri de obiecte Lucrul cu tablourile de obiecte este asemanator cu cel de primitive: • declarare • creare • initializare Diferenta apare la initializare, aici obiectele trebuie initializate fiecare in parte cu operatorul new, altfel ele nu exista (au valorea null). //declarare Punct puncte[]; //creare tablou de obiecte puncte = new Punct[3]; //initializare for (int i = 0; i < puncte.length; ++i) { //initializarea obiectelor din tablou puncte[i] = new Punct(i, 2 * i); } //afisarea elementelor de tablou for (int i = 0; i < puncte.length; ++i) System.out.println(puncte[i]); for (Punct p:puncte) System.out.println(p);
Siruri • sirul de caractere = o secventa de caractere de lungime arbitrară cuprinsa intre ghilimele; • Java NU are implementat un tip primitiv şir de caractere; • String este o clasă Java predefinită în pachetul java.lang.String pentru manipularea şirurilor de caractere; are mai bine de 50 de metode; inspectarea acestora se face cel mai simplu utilizând documentaţia JDK (vezi pagina urmatoare); • compilatorul Java aloca spaţiu pentru literalii sir în memorie iar operatorul de atribuire va stoca adresa respectivă în variabila şir; din acest motiv, testarea egalitătii a două şiruri nu se poate face cu operatorul == ci cu o metoda dedicata numita equals; • sirurile nu pot fi modificate; desi unele operatii par sa faca aceasta in realitate se intoarce un nou obiect String String s; //declararea unei variabile sir String sal = ”Salut”; //decl. cu initializare
Siruri – metode uzuale public class Siruri { public static void main(String[] args) { String s1, s2; String s3 = "Vasile"; //Vasile este un literal s2 ="Ion"; //Ion este un literal //concatenare s1 = s2 + s2; //lungimea unui sir de caractere System.out.println("Lungimea sirului: " +s1 +" este de " +s1.length()+" caractere"); //extagerea unui subsir System.out.println("Un subsir: " + s1.substring(0,3)); //editarea cu subsiruri s1 = s1.substring(0,3) + "-" + s1.substring(3,s1.length()); System.out.println("Editarea: " + s1); //testarea egalitatii sirurilor System.out.println("s1: " + s1+"\ns2: "+s2); System.out.println("Egalitatea lui s1 cu s2: " + s1.equals(s2)); System.out.println("Egalitatea lui Ion cu s2: " + "Ion".equals(s2)); /* comparatia sirurilor * intoarce < 0 daca s1 vine inainte de s2 in dictionar * intoarce 0 daca s1 si s2 sunt egale * intoarce > 0 daca s1 este dupa s2 in dictionar */ System.out.println("Compararea lui s1 cu s2: " + s1.compareTo(s2)); } }
Aplicatia 1 Scrieti o aplicatie Java pentru citirea si afisarea elementelor unui tablou unidimensional a, de 5 elemente. import java.util.Scanner; import javax.swing.*; public class TablouPrimitive { public static void main(String[] args) { final int NRELEM = 5; //lungimea tabloului int [] a; //declararea tabloului Scanner intrare; String iesire = "Indice\tValoarea element\n"; intrare = new Scanner(System.in); a = new int[NRELEM]; //crearea tabloului; //citire interactiva in mod text a elementelor de tablou for(int i = 0; i < a.length;++i) { System.out.print("a[" + i +"] = "); a[i]= intrare.nextInt(); //pt. cea de a 2-a metoda de afisare iesire+= i +"\t"+ a[i] + "\n"; //sir de iesire } //metoda 1: afisare simpla de elemente tablou for(int i = 0; i < a.length;++i) System.out.println(a[i]); //metoda 2: afisare cu fereastra de dialog JTextArea fereastraiesire = new JTextArea(); fereastraiesire.setText(iesire); JOptionPane.showMessageDialog(null,fereastraiesire,"indice - valoare tablou", JOptionPane.INFORMATION_MESSAGE); } }
Scrieti o aplicatie Java pentru sortarea crescatoare a elementelor unui tablou utilizand algoritmul bubblesort. Aplicatia 2/1 // Sortarea crescatoare a unui tablou de intregi import javax.swing.*; public class sortTab { int a []; //tabloul int asort[]; //clona int n; //numarul de elemente de tablou sortTab(int nrel) { n = nrel; //tabloul initial a = new int[n]; //tabloul sortat asort = new int [n]; //generam aleator n numere de la 0 la 100 //de tipul int si le stocam in a for(int i=0; i<n ; ++i) a[i] = (int)(100*Math.random()); //copiem tabloul a in asort try { System.arraycopy(a,0,asort,0,n); } catch(ArrayStoreException e) { System.out.println(e); } }
Aplicatia 2/2 //sortarea public void bubbleSort( ) { boolean esteinterschimbare = true; while (esteinterschimbare) { esteinterschimbare = false; for ( int i = 0; i < asort.length-1; ++i ) { if ( asort[i] > asort[i+1] ) { swap(asort,i,i+1); esteinterschimbare = true; } } } } //interschimbarea a 2 elemente de tablou private void swap( int tablou[], int i, int j ) { int aux; aux = tablou[i]; tablou[i] = tablou[j]; tablou[j] = aux; } //afisare tablou initial public String afisare(String txt) { String rez; rez = txt; for (int i=0; i<a.length; ++i ) rez += " " + a[ i ]; return rez; } //afisarea tablou sortat public String afisaresort(String txt) { String rez; rez = txt; for (int i=0; i<asort.length; ++i ) rez += " " + asort[ i ]; return rez; }
Aplicatia 2/3 public static void main(String args[]) { sortTab st; String rez; st = new sortTab(17); rez = st.afisare("a - Tablou initial:\n"); st.bubbleSort(); // sortare tablou rez += st.afisaresort("\n\nasort - Tabloul cu elementele sortate:\n"); JTextArea ferRez = new JTextArea(); ferRez .setText( rez ); JOptionPane.showMessageDialog(null, rez, "Sortare crescatoare",JOptionPane.INFORMATION_MESSAGE); } }
Bibliografie • http://www.east.utcluj.ro/mb/mep/antal/downloads.html > Java: course, IDE (JDeveloper), JDK and JRE, JDeveloper labs. • http://docs.oracle.com/cd/E18941_01/tutorials/jdtut_11r2_50/jdtut_11r2_50.html > Getting Started With the JDeveloper IDE