This is an old revision of the document!
Arhiva laborator: Arhiva
Se cere realizarea unui program care citește un fișier text și afișează cuvintele distincte.
În această problemă, prin “cuvânt” înțelegem o secvență de caractere obținută prin separare atât după spații, cât și după semnele uzuale de punctuație. Tokenizarea se va face exclusiv cu StringTokenizer, folosind o listă de delimitatori care include cel puțin: spațiul ' ', tabul '\t', virgula ,, punctul ., punct și virgulă ;, două puncte :, semnele !?, ghilimele ”', paranteze ()[]{}, cratime, etc. Se vor ignora tokenurile vide (dacă apar). Compararea cuvintelor este case-sensitive („Ana” și „ana” sunt diferite).
Afișarea se face fără a apela nicio funcție de sortare sau de inversare a ordinii din afara colecției și se face în două etape: mai întâi se construiește un TreeSet<String> cu ordonare naturală (crescătoare), folosind constructorul fără argument și care este populat cu toate cuvintele distincte extrase din fișier. Apoi, plecând strict de la setul obținut la pasul anterior, construiți al doilea TreeSet<String> - creați o instanță nouă inițializată cu un comparator descrescător și adăugați în ea toate elementele din primul set, fără a reciti fișierul. Al doilea set trebuie să rezulte exclusiv prin această reconstrucție - nu se folosesc sortări sau inversări externe precum Collections.sort, List.sort, descendingSet(), etc..
Se vor implementa două metode, apelate din main:
public TreeSet<String> printWords(String fileName) throws IOException
- citește fișierul și întoarce setul crescător, instanțiat fără comparator și populat prin separare strictă la spații si semne punctuație.
public TreeSet<String> printWordsComparator(TreeSet<String> asc)
- primește exact setul obținut anterior și construiește, fără a reciti fișierul, un nou TreeSet<String> cu ordonare descrescătoare (instanțiat cu un comparator), în care sunt copiate toate elementele din primul set.
În main se apelează pe rând cele două metode și se afișează cuvintele, câte un cuvânt pe linie: mai întâi în ordine crescătoare, apoi o linie separatoare —, urmată de ordinea descrescătoare.
Se poate folosi ca fișier de intrare fișierul test01.txt din arhivă!
Definiți o clasă LinkedSet care modelează o mulțime de elemente distincte, implementată peste o listă înlănțuită. Clasa va extinde LinkedList și va implementa Set, iar elementele vor fi de tip Object. Scopul este ca structura să se comporte ca un Set - să nu accepte duplicate, dar să păstreze ordinea de inserare specifică listei.
Vor fi supradefinite cele trei metode indicate mai jos, astfel încât să respecte unicitatea:
boolean add(Object obj)
- adaugă elementul doar dacă nu există deja în colecție (după equals). Metoda întoarce true dacă a inserat și false dacă elementul era deja prezent.
void add(int index, Object obj)
- menține prioritatea regulii de mulțime. Operația la un index anume este permisă numai dacă elementul nu există în colecție; în caz contrar, nu efectuează nicio modificare (nu se inserează un duplicat).
Object set(int index, Object obj)
- înlocuiește elementul de la poziția indicată doar dacă această înlocuire nu introduce un duplicat în altă poziție. Dacă obj se găsește deja în colecție pe un alt index, se va arunca o excepție de tip IllegalArgumentException. Dacă nu se creează duplicat, se face înlocuirea și se returnează elementul vechi.
Pentru verificarea egalității se folosește metoda equals a obiectelor introduse.
Pentru testare puteți folosi clasa existentă în Test2.java.
Să se definească o clasă SListSet pentru o mulțime ordonată de obiecte, care extinde clasa LinkedList si implementează interfața SortedSet. Clasa va conține un obiect de tip Comparator și metodele:
Comparator comparator () ; //comparator folosit (null pentru comparatia naturala) boolean add(Object o); //adauga un elemnt in multime daca nu exista deja si sorteaza multimea Object first(); //primul obiect din multime Object last(); // ultimul obiect din multime SortedSet subSet(Object from, Object to); // o submultime ordonata SortedSet headSet(Object to); // o submultime cu primele obiecte SortedSet tailSet(Object from); //o submultime cu ultimele obiecte
Program pentru afișarea numerelor liniilor dintr-un fișier text în care apare fiecare cuvânt distinct. Se va folosi un dicționar cu liste de valori asociate fiecărei chei. Dicționarul va fi de tip TreeMap, iar listele vor fi de tip LinkedList.
Pentru afisare se va folosi un Iterator pe multimea intrarilor din dictionar. La afișare, fiecare cuvânt va începe pe o linie nouă și va fi urmat, pe liniile următoare, de lista numerelor liniilor în care apare. Pentru fiecare cuvânt în parte se va afișa la sfârșit numărul de apariții al acestuia.
Se poate folosi ca fisier de intrare tot fisierul test01.in din arhiva!
Set - iterator()
Program pentru crearea și afișarea unui dicționar cu numele fișierelor dintr-un director împreună cu dimensiunea lor exprimată în kiloocteți (ca număr întreg). Numele reprezintă cheia, iar dimensiunea este valoarea asociată cheii. Programul va folosi succesiv clasele HashMap și TreeMap. Afișarea se va face atât în ordinea alfabetică a numelor cât și în ordinea dimensiunii fișierelor (două afișări).
entrySet din Map transformă colecția în Set de intrari;
Collections.sort sortează o colectie după un criteriu definit.