This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
laboratoare:colectii [2019/01/06 17:15] Laurentiu Stamate [Resurse] |
laboratoare:colectii [2019/11/30 13:44] (current) Florin Mihalache [Resurse] |
||
---|---|---|---|
Line 244: | Line 244: | ||
==Exerciţii== | ==Exerciţii== | ||
- | - (**1p**) Instanţiati o colecţie care sǎ **nu** permitǎ introducerea elementelor duplicate, folosind o implementare corespunzǎtoare din bibliotecă. La introducerea unui element existent, semnalaţi eroare. Colecţia va reţine ''String''-uri şi va fi parametrizatǎ. | + | - (**2p**) În scheletul de laborator, aveți un fișier cu o clasă (Student), care are trei membri: name (String), surname (String), id (long) și averageGrade (double) - media unui student. |
- | - (**2p**) Creaţi o clasǎ ''Student''. | + | * Clasa Student va implementa interfața [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Comparable.html|Comparable]]<Student>, folosită la sortări, implementând metoda [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Comparable.html#compareTo(T)|compareTo]]. În metoda compareTo, studenții vor fi comparați mai întâi după medie, apoi după numele de familie, apoi dupa prenume (adică dacă doi studenți au aceeași medie, ei vor fi comparați după numele de familie și dacă au același nume de familie, atunci vor fi comparați după prenume). Recomandăm să suprascrieți metoda //toString//, pentru a putea afișa datele despre un student. |
- | - Adǎugaţi urmǎtorii membri: | + | - (**1p**) Creați 5 obiecte de tip Student și adăugați-le într-un ArrayList, pe care să îl sortați (hint: [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/Collections.html#sort(java.util.List)|Collections.sort]]), apoi afisați conținutul din ArrayList. |
- | * **câmpurile** ''nume'' (de tip ''String'') şi ''medie'' (de tip ''float'') | + | - (**2p**) Adăugați ArrayList-ul definit la subpunctul anterior într-un PriorityQueue (hint: [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/Collection.html#addAll(java.util.Collection)|Collection.addAll]]), care folosește un Comparator, unde elementele sunt sortate crescător după id (aici puteti folosi Long.compare ca să comparați două numere de tip long). |
- | * un **constructor** care îi iniţializeazǎ | + | - (**1p**) Suprascrieți metodele //equals// și //hashCode// în clasa Student (hint: puteți folosi generatorul de cod din IntelliJ). |
- | * metoda ''toString''. | + | - (**2p**) Folosiți un //HashMap<Student, LinkedList<String>>//, în care se vor adăuga perechi de tipul (Student, lista de materii pe care le are studentul respectiv), iar apoi afisați conținutul colecției (hint: Map.Entry și entrySet()). |
- | - Folosiţi codul de la **exerciţiul anterior** şi modificaţi-l astfel încât colecţia aleasǎ de voi sǎ reţinǎ obiecte de tip ''Student''. Testaţi prin adǎugare de elemente duplicate, având aceleaşi valori pentru toate câmpurile, instanţiindu-le, de fiecare datǎ, cu ''new''. Ce observaţi? | + | - (**2p**) Extindeți clasa //LinkedHashSet<Integer>//, cu o clasă în care se vor putea adăuga doar numere pare. Vor fi suprascrise metodele //add// și //addAll//, în așa fel încât să nu fie permise adăugarea de numere impare în colecție. Pentru testare, adăugați numere pare și impare, iar după aceea iterați prin colecție, folosind [[https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/util/Iterator.html|Iterator]] (tipizat cu Integer) sau folosind forEach, afișând elementele din colecție. Inlocuiți LinkedHashSet cu HashSet - ce observați cu privire la ordinea de inserare a elementelor? Dar dacă ați înlocui cu TreeSet? |
- | - Prelucraţi implementarea de mai sus astfel încât colecţia sǎ reprezinte o tabelǎ de dispersie, care calculează codul de dispersie al elementelor dupǎ un criteriu ales de voi (puteţi suprascrie funcţia **hashCode**). | + | |
- | * În ''Student'' suprascrieți metoda ''equals'' astfel încât să se ţină cont de câmpurile clasei, şi încercaţi din nou. Ce observaţi? | + | |
- | * //Hint:// [[http://docs.oracle.com/javase/8/docs/api/java/util/Set.html#add(E)|Set.add]], [[http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#equals(java.lang.Object)|Object.equals]], [[http://docs.oracle.com/javase/8/docs/api/java/lang/Object.html#hashCode()|Object.hashCode]] | + | |
- | - (**2p**) Plecând de la implementarea exerciţiului anterior, realizaţi urmǎtoarele modificǎri: | + | |
- | * Supraîncǎrcaţi, în clasa ''Student'', metoda ''equals'', cu o variantǎ care primeşte un parametru ''Student'', şi care întoarce întotdeauna ''false''. | + | |
- | * Testaţi comportamentul prin crearea unei colecţii ce conţine instanţe de ''Student'' şi iteraţi prin această colecţie, afişând la fiecare pas ''element.equals(element)'' şi ''((Object)element).equals(element)'' (unde ''element'' este numele de variabilă ales pentru fiecare element al colecţiei). Cum explicaţi comportamentul observat? Dacă folosiţi un iterator, acesta va fi şi el **parametrizat**. | + | |
- | - (**3p**) Creați clasa ''Gradebook'', de tip ''Map'', pentru reţinerea studenţilor dupǎ medie: cheile sunt mediile și valorile sunt liste de studenți. Gradebook va menţine cheile **ordonate descrescǎtor**. Extindeţi o implementare potrivitǎ a interfeţei ''Map'', care sǎ permitǎ acest lucru. | + | |
- | - Caracteristicile clasei definite sunt: | + | |
- | - Cheile pot avea valori de la 0 la 10 (corespunzǎtoare mediilor posibile). Verificați acest lucru la adăugare. | + | |
- | - Valoarea asociată fiecǎrei chei va fi o listǎ (''List'') care va reţine toţi studenţii cu media rotunjitǎ egalǎ cu cheia. Considerǎm cǎ un student are media rotunjitǎ 8 dacǎ media sa este în intervalul [7.50, 8.49]. | + | |
- | - Implementați un [[http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html|Comparator]] pentru stabilirea ordinii cheilor. Gradebook va primi un parametru de tip ''Comparator'' în constructor și îl va da mai departe constructorului clasei moștenite. | + | |
- | - Definiţi în clasǎ metoda ''add(Student)'', ce va adǎuga un student în lista corespunzǎtoare mediei lui. Dacǎ, în prealabil, nu mai existǎ niciun student cu media respectivǎ (rotunjitǎ), atunci lista va fi creatǎ la cerere. | + | |
- | - Testați clasa: | + | |
- | - instanțiați un obiect Gradebook și adăugați in el câţiva studenţi. | + | |
- | - iteraţi pe Gradebook şi sortaţi alfabetic fiecare listǎ de studenţi pentru fiecare notă. Pentru a sorta, se va folosi metoda [[https://docs.oracle.com/javase/8/docs/api/java/util/Collections.html#sort-java.util.List-|Collections.sort]], iar clasa Student va implementa o interfață care specifică modul în care sunt comparate elementele. | + | |
- | * clasa ''Student'' va implementa interfaţa [[http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html|Comparable]], suprascriind metoda [[http://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html#compareTo(T)|compareTo]]. | + | |
- | - (**2p**) Creaţi o clasǎ care moşteneşte ''HashSet<Integer>''. | + | |
- | * Definiţi în aceastǎ clasǎ o variabilǎ membru care reţine numǎrul total de elemente adǎugate. Pentru a contoriza acest lucru, suprascrieți metodele ''add'' şi ''addAll''. Pentru adǎugarea efectivǎ a elementelor, folosiţi implementǎrile din clasa pǎrinte (''HashSet''). | + | |
- | * Testaţi, folosind atât ''add'' cât şi ''addAll''. Ce observaţi? Corectaţi dacǎ este cazul. | + | |
- | * Modificaţi implementarea astfel încât clasa voastrǎ sǎ moşteneascǎ ''LinkedList<Integer>''. Ce observaţi? Ce **concluzii** trageţi? | + | |
- | * Hint: [[http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#add(E)|Collection.add]], [[http://docs.oracle.com/javase/8/docs/api/java/util/Collection.html#addAll(java.util.Collection)|Collection.addAll]]. | + | |
- | * Hint: implementarea ''addAll'' din sursele pentru [[http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/HashSet.java#HashSet|HashSet]] şi [[http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/util/LinkedList.java#LinkedList|LinkedList]]. | + | |
== Resurse == | == Resurse == | ||
- | * {{:laboratoare:colectii:lab7-sol.zip|Soluție}} | + | * {{:laboratoare:colectii:schelet-lab8-2019.zip|Schelet}} |
- | * <html><a class="media mediafile mf_pdf" href="/poo/laboratoare/colectii?do=export_pdf">PDF laborator</a></html> | + | * {{:laboratoare:colectii:sol-lab8-2019.zip|Soluție}} |
+ | * [[laboratoare:old-exercises#colectii|Exerciții din alți ani]] | ||
+ | |||
+ | == Linkuri utile == | ||
+ | * [[https://www.baeldung.com/java-8-streams|Streams]], introduse din Java 8, pot fi folosite și pentru a aplica operații pe colecții. Nu le folosim momentan la laborator însă le puteți utiliza la teme: | ||
+ | * [[https://www.geeksforgeeks.org/stream-in-java/|Java streams]] | ||
+ | * [[https://www.geeksforgeeks.org/stream-filter-java-examples/| Filter streams examples]] |