Zadanie 7

Najneskorší termín odovzdania: 1.12.2024 (nedeľa) o 18:00
Odovzdávané súbory: NumberList.java, FrequencyTable.java (v prípade potreby aj Word.java)

Doplňujúce požiadavky:

  • riešenia, ktoré nebude možné skompilovať (t.j. riešenia so syntaktickými chybami) nebudú hodnotené,
  • zdrojový kód správne naformátujte (CTRL+ALT+L),
  • očakáva sa vhodne okomentovaný zdrojový kód
  • v prípade potreby si vytvorte pomocné metódy
  • je zakázané používať triedy Java Collections Frameworku (t.j. používajte len triedy, ktoré boli spomenuté na prednáškach).

Poznámky:

  • Ak triedu Word nevytvárate, pri odosielaní do Moodle ako súbor Word.java odošlite prázdny textový súbor (s týmto menom). Niektoré systémy neumožňujú posielať súbory bez obsahu, ak máte problem s uploadom, tak namiesto prázdneho súboru vytvorte súbor s jednou medzerou.

Zoznam čísel

Naprogramujte triedu NumberList, ktorá reprezentuje dynamické pole čísel (pole, ktoré „dokáže“ meniť svoju veľkosť). Bodové hodnotenia jednotlivých metód sú uvedené v komentároch v zdrojovom kóde so štruktúrou triedy.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
/**
 * Trieda realizujuca dynamicke pole (zoznam) cisel.
 */

public class NumberList {
    //Hodnotenie: konstruktory a metody bez uvedeneho hodnotania celkom 3 body

    /**
     * Konstruktor zoznamu cisel - vytvori prazdny zoznam
     */

    public NumberList() {

    }

    /**
     * Konstruktor zoznamu cisel, pricom zoznam sa inicializuje hodnotami PODLA pola
     * @param numbers pole, podla ktoreho sa ma inicializovat zoznam cisel
     */

    public NumberList(int[] numbers) {

    }

    /**
     * Konstruktor zoznamu cisel, pricom zoznam sa inicializuje hodnotami PODLA ineho zoznamu
     * @param numberList zoznam, podla ktoreho sa ma inicializovat zoznam cisel
     */

    public NumberList(NumberList numberList) {

    }

    /**
     * Vrati cislo aktualne ulozene na zadanom indexe v zozname
     * @param index index prvku zoznamu, ktoreho hodnotu chceme vratit
     * @return cislo na zadanom indexe v zozname
     */

    public int get(int index) {
        //???
    }

    /**
     * Nastavi hodnotu prvku zoznamu na zadanom (uz existujucom) indexe
     * @param index index prvku
     * @param value nova hodnota pre prvom na zadanom indexe
     */

    public void set(int index, int value) {
        //???
    }

    /**
     * Prida na koniec zoznamu novy prvok so zadanou hodnotou
     * @param value hodnota prvku pridaneho na koniec zoznamu
     */

    public void add(int value) {
        //??? (1 bod)
    }

    /**
     * Vrati aktualny pocet prvkov v zozname cisel
     * @return pocet prvkov v zozname cisel
     */

    public int size() {
        //???
    }

    /**
     * Vyprazdni zoznam
     */

    public void clear() {
        //???
    }

    /**
     * Odstrani zo zoznamu prvok na zadanom indexe a vrati hodnotu odstraneneho prvku
     * @param index index odstranovaneho prvku v zozname
     * @return hodnota odstranovaneho prvku v zozname
     */

    public int remove(int index) {
        //??? (2 body)
    }

    /**
     * Vrati obsah zoznamu vo forme formatovaneho retazca [prvok1, prvok2, prvok3, prvok4]
     */

    @Override
    public String toString() {
        //??? (1 bod)
    }
}

Testovací príklad (aby ste si overili, že ste implementovali konštruktory triedy NumberList správne):


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public static void main(String[] args) {
    int[] numbers = new int[]{4, 6, 2, 1, 3, 8};
    // Vypise: [4, 6, 2, 1, 3, 8]
    System.out.println(Arrays.toString(numbers));

    NumberList z1 = new NumberList(numbers);
    z1.set(1, 8);
    // Vypise: [4, 8, 2, 1, 3, 8]
    System.out.println(z1.toString());

    // Vypise: [4, 6, 2, 1, 3, 8], t.j. pole sa nezmenilo
    System.out.println(Arrays.toString(numbers));

    NumberList z2 = new NumberList(z1);
    // Vypise: [4, 8, 2, 1, 3, 8]
    System.out.println(z1.toString());
    // Vypise: [4, 8, 2, 1, 3, 8]
    System.out.println(z2.toString());

    z2.set(1, 10);

    // Vypise: [4, 8, 2, 1, 3, 8]
    System.out.println(z1.toString());
    // Vypise: [4, 10, 2, 1, 3, 8]
    System.out.println(z2.toString());
}

Frekvenčná tabuľka

Vytvorte triedu FrequencyTable, ktorá slúži na uchovávanie počtu výskytu slov (reťazcov) napr. v nejakom texte. Frekvenčnú tabuľku si môžete predstaviť ako tabuľku, ktorá má 2 stĺpce: slovo a počet výskytov. Platí, že každé slovo sa v tabuľke nachádza len raz. Príklad:

slovo počet výskytov
Java 5
zdrojak 2
je 3
a 2
kopirovat 4
PAZko 2

Iný pohľad na frekvenčnú tabuľku je ten, že je to vlastne nejaká skupina dvojíc [slovo, počet výskytov] s tou vlastnosťou, že prvá zložka každej dvojice sa v skupine nachádza len raz.

Upozornenie: Aj prázdne slovo (prázdny reťazec) považujeme za slovo. Pri štandardnej implementácii toto upozornenie môžete ignorovať. Toto upozornenie sa týka tých, ktorí by chceli prázdny reťazec použiť ako nejakú špeciálnu hodnotu.

Bodové hodnotenia jednotlivých metód sú uvedené v komentároch v zdrojovom kóde so štruktúrou triedy.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class FrequencyTable {

    // ??? Konstruktor + clear + getWordCount: 2 body

    /**
     * Konstruktor: vytvori prazdnu frekvencnu tabulku
     */

    public FrequencyTable() {
        // ???
    }

    /**
     * Vyprazdni obsah tabulky (vratene vlozenych slov)
     */

    public void clear() {
        // ???
    }

    /**
     * Vrati pocet vyskytov slova. V pripade, ze sa slovo v tabulke nenachadza,
     * vrati 0
     *
     * @param word
     *            retazec, ktoreho pocet vyskytov chceme zistit
     * @return pocet vyskytov zadaneho slova (retazca)
     */

    public int getNumberOfOccurrences(String word) {
        // ??? (1 body)
    }

    /**
     * Poznaci novy vyskyt slova vo frekvencnej tabulke (zvysi pocitadlo
     * priradene danemu slovu o 1). Ak take slovo sa v tabulke nenachadza,
     * nastavi pocet jeho vyskytov na 1
     *
     * @param word
     *            slovo, ktoreho vyskyt chceme poznacit vo frekvencnej tabulke
     */

    public void addOccurrence(String word) {
        // ??? (2 body)
    }

    /**
     * Vrati pocet slov vo frekvencnej tabulke (vsetky maju nenulovy pocet vyskytov)
     * @return pocet slov vo frekvencnej tabulke
     */

    public int getWordCount() {
        // ???
    }

    /**
     * Vrati slova vo frekvencnej tabulke v novovytvorenom poli retazcov
     * @return referencia na novovytvorene pole retazcov so slovami v tabulke
     */

    public String[] getWords() {
        // ??? (1 bod)
    }


    /**
     * Vrati obsah frekvencnej tabulky ako retazec vo formate
     * [slovo1=pocetVyskytov1, slovo2=pocetVyskytov2]
     */

    public String toString() {
        // ??? (1 bod)
    }
}

V prípade, že sa rozhodnete použiť pomocnú triedu na uchovávanie dvojíc (párov) [slovo, počet výskytov], pomocnú triedu nazvite Word.

Príklad použitia:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
import java.io.*;
import java.util.*;

public class Launcher {

    /**
     * @param args
     */

    public static void main(String[] args) {
        FrequencyTable ft = new FrequencyTable();

        Scanner sc = null;
        try {
            sc = new Scanner(new File("subor.txt"));
            while (sc.hasNext())
                ft.addOccurrence(sc.next());
        } catch (FileNotFoundException e) {
            System.err.println("Subor neexistuje.");
        } finally {
            if (sc != null)
                sc.close();
        }

        System.out.println("Pocet roznych precitanych slov: " + ft.getWordCount());

        // Vypis po slovach
        String[] words = ft.getWords();
        System.out.println("Vyskyty slov: ");
        for (int i = 0; i < words.length; i++)
            System.out.println(words[i] + ": " + ft.getNumberOfOccurrences(words[i]));

        // test "hacknutia" objektu
        for (int i = 0; i < words.length; i++) {
            words[i] = "???";
        }

        // Vypis cez toString
        System.out.println("Vyskyty slov inak: " + ft.toString());
    }

}