This shows you the differences between two versions of the page.
|
poo:laboratoare:12 [2026/01/12 07:38] george.tudor1906 |
poo:laboratoare:12 [2026/01/12 07:49] (current) george.tudor1906 |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ===== Laboratorul 12 – Generics & Collections ===== | + | ===== Laboratorul 12 – Genericitate. Design Patterns 2 ===== |
| + | |||
| + | {{:poo:laboratoare:arhiva12_genericitate_dp2.zip|Arhiva laborator}} | ||
| === Problema 1 === | === Problema 1 === | ||
| Line 32: | Line 34: | ||
| === Problema 2 - Decorator === | === Problema 2 - Decorator === | ||
| - | Pornind de la diagrama data, implementati clasele si interfetele din diagrama si cele | + | Folosind **design pattern-ul Decorator**, implementați clasele și interfețele necesare |
| - | care mai sunt necesare pentru a putea apoi sa construiti un obiect de tip **IceCream** | + | pentru a putea construi un obiect de tip **IceCream** ce conține două toppinguri: |
| - | ce contine doua toppinguri: **Chocolate** si **Vanilla**. Afisati pretul si descrierea | + | **Chocolate** și **Vanilla**. Afișați prețul și descrierea acestei înghețate. |
| - | acestei inghetate (design pattern-ul Decorator). | + | |
| - | In constructorul fiecarui topping, respectiv in constructorul **BasicIceCream** se va | + | În constructorul fiecărui topping, respectiv în constructorul **BasicIceCream** se va |
| - | afisa un mesaj prin care se specifica ce se adauga. | + | afișa un mesaj prin care se specifică ce se adaugă. |
| - | Preturi: basicIceCream 0.5, ciocolata 1.5, vanilie 2. | + | Prețuri: basicIceCream 0.5, ciocolată 1.5, vanilie 2. |
| Descriere metode: | Descriere metode: | ||
| - | * **getDescription()**: returneaza elementele componente ale inghetatei pana acum (adica lista tuturor componentelor adaugate anterior plus topping-ul curent); | + | * **getDescription()**: returnează elementele componente ale înghețatei până acum (adică lista tuturor componentelor adăugate anterior plus topping-ul curent); |
| - | * **getPrice()**: returneaza costul curent al inghetatei (suma tuturor elementelor adaugate anterior + costul toppingului curent). | + | * **getPrice()**: returnează costul curent al înghețatei (suma tuturor elementelor adăugate anterior + costul toppingului curent). |
| <note important> | <note important> | ||
| - | Pentru a putea adauga functionalitate (in cazul de fata un topping) unui obiect, | + | Pentru a putea adăuga funcționalitate (în cazul de față un topping) unui obiect, |
| - | vom avea nevoie de o referinta catre obiectul respectiv in decorator. | + | vom avea nevoie de o referință către obiectul respectiv în decorator. |
| - | Un con (obiect de tipul BasicIceCream) fara topping este considerat tot o inghetata! | + | Un con (obiect de tipul BasicIceCream) fără topping este considerat tot o înghețată! |
| </note> | </note> | ||
| <note warning> | <note warning> | ||
| - | Pentru a putea adauga topping-uri avem nevoie de un con! | + | Pentru a putea adăuga topping-uri avem nevoie de un con! |
| </note> | </note> | ||
| Line 73: | Line 74: | ||
| * Metoda **removeDuplicates** primește ca parametru un obiect de tip ArrayList și transformă lista într-o mulțime, eliminând duplicatele. | * Metoda **removeDuplicates** primește ca parametru un obiect de tip ArrayList și transformă lista într-o mulțime, eliminând duplicatele. | ||
| - | * Metoda **max** are ca parametru tot un ArrayList și returnează elementul maximal din listă. | + | * Metoda **max** are ca parametru tot un ArrayList și returnează elementul maxim din listă. |
| * Metoda **binarySearch** este folosită pentru a determina poziția unei valori într-o listă ordonată, utilizând pentru aceasta algoritmul de căutare binară, detaliat în blocul de cod de mai jos. | * Metoda **binarySearch** este folosită pentru a determina poziția unei valori într-o listă ordonată, utilizând pentru aceasta algoritmul de căutare binară, detaliat în blocul de cod de mai jos. | ||
| <code java> | <code java> | ||
| int BinarySearch(v, start, end, x) { | int BinarySearch(v, start, end, x) { | ||
| - | // conditia de oprire (x nu se afla in v) | + | // condiția de oprire (x nu se află în v) |
| if (start > end) | if (start > end) | ||
| return -1; | return -1; | ||
| Line 85: | Line 86: | ||
| int mid = (start + end) / 2; | int mid = (start + end) / 2; | ||
| - | // etapa stapaneste | + | // etapa stăpânește |
| if (v[mid] == x) | if (v[mid] == x) | ||
| return mid; | return mid; | ||
| Line 108: | Line 109: | ||
| <code java> | <code java> | ||
| - | // afisare | + | // afișare |
| public String toString(); | public String toString(); | ||
| Line 122: | Line 123: | ||
| === Problema 5 === | === Problema 5 === | ||
| - | Să se definească o clasă generica ArrayMap, pentru un dicționar realizat din doi vectori | + | Să se definească o clasă generică ArrayMap, pentru un dicționar realizat din doi vectori |
| (un vector de chei și un vector de valori asociate, obiecte din clasa Vector), care să | (un vector de chei și un vector de valori asociate, obiecte din clasa Vector), care să | ||
| poată înlocui o clasă HashMap sau TreeMap. | poată înlocui o clasă HashMap sau TreeMap. | ||
| Line 135: | Line 136: | ||
| public Collection<V> values(); | public Collection<V> values(); | ||
| public Set<Map.Entry<K, V>> entrySet(); | public Set<Map.Entry<K, V>> entrySet(); | ||
| - | // atentie! Se va defini o clasa interna pentru o intrare in dictionar - Map.Entry | + | // atenție! Se va defini o clasă internă pentru o intrare în dicționar - Map.Entry |
| </code> | </code> | ||
| - | Afișați dicționarul folosind System.out.println(dictionar) si apoi folosind un Iterator | + | Afișați dicționarul folosind System.out.println(dictionar) și apoi folosind un Iterator |
| - | pentru a parcurge mulțimea intrarilor generată de metoda entrySet. | + | pentru a parcurge mulțimea intrărilor generată de metoda entrySet. |