7. sada domácich zadaní

Najneskorší termín odovzdania: 6.12.2015 (nedeľa) o 21:00
Odovzdávané súbory: ZoznamCisel.java, FrekvencnaTabulka.java (v prípade potreby aj PocetnostSlova.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+SHIFT+F),
  • 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 PocetnostSlova nevytvárate, pri odosielaní do Moodle ako súbor PocetnostSlova.java odošlite prázdny textový súbor (s týmto menom).

Zoznam čísel

Naprogramujte triedu ZoznamCisel, 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.

/**
 * Trieda realizujuca dynamicke pole (zoznam) cisel.
 */

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

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

        public ZoznamCisel() {

        }

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

        public ZoznamCisel(int[] pole) {

        }

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

        public ZoznamCisel(ZoznamCisel zoznam) {

        }

        /**
         * 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 hodnota nova hodnota pre prvom na zadanom indexe
         */

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

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

        public void add(int hodnota) {
                //??? (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 ZoznamCisel správne):

public static void main(String[] args) {
        int[] pole = new int[]{4, 6, 2, 1, 3, 8};
        // Vypise: [4, 6, 2, 1, 3, 8]
        System.out.println(Arrays.toString(pole));

        ZoznamCisel z1 = new ZoznamCisel(pole);
        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(pole));

        ZoznamCisel z2 = new ZoznamCisel(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 FrekvencnaTabulka, 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:

slovopočet výskytov
Java5
zdrojak2
je3
a2
kopirovat4
PAZko2

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.

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

public class FrekvencnaTabulka {

        // ??? Konstruktor + vyprazdni + pocetSlov: 2 body

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

        public FrekvencnaTabulka() {
                // ???
        }

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

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

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

        public int pocetVyskytov(String slovo) {
                // ??? (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 slovo
         *            slovo, ktoreho vyskyt chceme poznacit vo frekvencnej tabulke
         */

        public void pridajVyskyt(String slovo) {
                // ??? (2 body)
        }

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

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

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

        public String[] slovaVTabulke() {
                // ??? (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 PocetnostSlova.

Príklad použitia:

import java.io.*;
import java.util.*;

public class Spustac {

        /**
         * @param args
         */

        public static void main(String[] args) {
                FrekvencnaTabulka vyskyty = new FrekvencnaTabulka();

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

                System.out.println("Pocet roznych precitanych slov: " + vyskyty.pocetSlov());

                // Vypis po slovach
                String[] slova = vyskyty.slovaVTabulke();
                System.out.println("Vyskyty slov: ");
                for (int i = 0; i < slova.length; i++)
                        System.out.println(slova[i] + ": " + vyskyty.pocetVyskytov(slova[i]));

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

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

}