This is an old revision of the document!


Laboratorul 12 – Generics & Collections

Problema 1

Pornind de la codul de mai jos, asigurați faptul că se va apela codul aferent tipului dinamic al parametrului, definind clasele Hero, Warrior, Ninja, Rogue și StormFire, în mod minimal!

public class Binding {
    public static void main(String args[]) {
        Hero h1 = new Warrior(), h2 = new Ninja();
        Hero h3 = new Rogue();
        BadLuck bl = new StormFire();
        bl.execute(h1);
        bl.execute(h2);
        bl.execute(h3);
    }
}
 
abstract class BadLuck {
    abstract void execute(Hero h);
    abstract void execute(Warrior w);
    abstract void execute(Ninja n);
    abstract void execute(Rogue r);
}

Clasele Hero și BadLuck sunt clase abstracte!

Problema 2 - Decorator

Pornind de la diagrama data, implementati clasele si interfetele din diagrama si cele care mai sunt necesare pentru a putea apoi sa construiti un obiect de tip IceCream ce contine doua toppinguri: Chocolate si Vanilla. Afisati pretul si descrierea acestei inghetate (design pattern-ul Decorator).

In constructorul fiecarui topping, respectiv in constructorul BasicIceCream se va afisa un mesaj prin care se specifica ce se adauga.

Preturi: basicIceCream 0.5, ciocolata 1.5, vanilie 2.

Descriere metode:

  • getDescription(): returneaza elementele componente ale inghetatei pana acum (adica lista tuturor componentelor adaugate anterior plus topping-ul curent);
  • getPrice(): returneaza costul curent al inghetatei (suma tuturor elementelor adaugate anterior + costul toppingului curent).

Pentru a putea adauga functionalitate (in cazul de fata un topping) unui obiect, vom avea nevoie de o referinta catre obiectul respectiv in decorator. Un con (obiect de tipul BasicIceCream) fara topping este considerat tot o inghetata!

Pentru a putea adauga topping-uri avem nevoie de un con!

Exemplu output:

Adding cone
Adding choco
Adding vanilla
Ingrediente: cone, chocolate, vanilla
Cost: 4.0

Problema 3

Definiți clasa GenericListMethods care să implementeze interfața, pusă la dispoziție în arhiva laboratorului, GenericInterface.

Această interfață conține operații care prelucrează o listă, cu elemente de tip Comparable.

  • 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 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.
int BinarySearch(v, start, end, x) {
    // conditia de oprire (x nu se afla in v)
    if (start > end)
        return -1;
 
    // etapa divide
    int mid = (start + end) / 2;
 
    // etapa stapaneste
    if (v[mid] == x)
        return mid;
    if (v[mid] > x)
        return BinarySearch(v, start, mid - 1, x);
    if (v[mid] < x)
        return BinarySearch(v, mid + 1, end, x);
}

Problema 4

Pornind de la clasa abstractă AMatrix, pusă la dispoziție în arhiva laboratorului, implementați clasa IntegerMatrix care moștenește această clasă abstractă și modelează un tablou bidimensional cu numere întregi.

Clasa AMatrix moștenește clasa ArrayList. Astfel, matricea propriu-zisă este un obiect de tip ArrayList care conține elemente de tip ArrayList.

Clasa va conține metode pentru următoarele operații: afișarea matricei, adunarea a două matrice, și metoda sum pentru a aduna două elemente!

// afisare
public String toString();
 
// sum
public Integer sum(Integer obj1, Integer obj2);
 
// adunare
public AMatrix addition(AMatrix m);

Folosiți iteratori pentru parcurgerea colecțiilor sau bucle for each!

Problema 5

Să se definească o clasă generica 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ă poată înlocui o clasă HashMap sau TreeMap.

Astfel, această clasă va extinde clasa AbstractMap, suprascriind următoarele metode:

public String toString();
public V put(K, V);
public V get(Object);
public Set<K> keySet();
public Collection<V> values();
public Set<Map.Entry<K, V>> entrySet();
// atentie! Se va defini o clasa interna pentru o intrare in dictionar - Map.Entry

Afișați dicționarul folosind System.out.println(dictionar) si apoi folosind un Iterator pentru a parcurge mulțimea intrarilor generată de metoda entrySet.

poo/laboratoare/12.1768196330.txt.gz · Last modified: 2026/01/12 07:38 by george.tudor1906
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0