Zdrojový kód z prednášky 30.11.2011

Abstraktná trieda Film v balíčku sk.upjs.paz.filmy(súbor Film.java).

package sk.upjs.paz.filmy;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.Scanner;


public abstract class Film implements Serializable, Comparable<Film>{
        private String nazovFilmu = "";
        private String[] herci;
        private String[] zanre;
        private int dlzkaFilmu;
        private double hodnotenie;


        public int compareTo(Film druhyFilmy) {
                return nazovFilmu.compareTo(druhyFilmy.nazovFilmu);
        }

        /*
         * konštruktor bez parametrov - je potrebné ho napísať, ak ho chceme používať,
         * lebo sa negeneruje implicitný, ak už nejaký konštruktor v triede je
         */

        public Film() {

        }

        public Film(String nazovFilmu, String[] herci, String[] zanre,
                        int dlzkaFilmu, double hodnotenie) {
                setNazovFilmu(nazovFilmu);
                this.herci = herci;
                this.zanre = zanre;
                setDlzkaFilmu(dlzkaFilmu);
                this.hodnotenie = hodnotenie;
        }

        // toto sa nikdy nevykoná, lebo používame iba oddedené triedy
        public abstract String dajUmiestnenie();

        // metóda vypíše všetky informácie o filme vrátane informácie o médiu,
        // lebo sa plánuje iba volanie z objektov oddedených tried
        public String toString() {
                StringBuilder sb = new StringBuilder();
                sb.append(nazovFilmu+ "\n");
                sb.append("dlzka filmu je "+ dlzkaFilmu + "\n");
                sb.append("hodnotenie:" + hodnotenie + "\n");
                sb.append("Herci: ");
                for (int i = 0; i < herci.length; i++) {
                        sb.append(herci[i]+",");
                }
                sb.append("\nZanre: ");
                for (int i = 0; i < zanre.length; i++) {
                        sb.append(zanre[i]+",");
                }
                sb.append("\n");
                // bude sa volať prekryté dajUmiestnenie z objektov oddedených tried
                sb.append(dajUmiestnenie());
                return sb.toString();
        }

        // uloží cez PrintWriter do súboru informácie o filme (nie o umiestnení)
        // táto metóda by sa nemala volať z cudzieho kódu, ale len z metód ulozSa
        // oddedených tried, ktoré zabezpečia výpis špecifických informácií okolo tohoto výpisu
        public void ulozSa(PrintWriter pw) {
                pw.println(nazovFilmu);
                pw.println(herci.length);
                for (int i = 0; i < herci.length; i++) {
                        pw.println(herci[i]);
                }
                pw.println(zanre.length);
                for (int i = 0; i < zanre.length; i++) {
                        pw.println(zanre[i]);
                }
                pw.println(dlzkaFilmu);
                pw.println(hodnotenie);
        }

        // načíta cez Scanner zo súboru informácie o filme (nie o umiestnení)
        // táto metóda by sa nemala volať z cudzieho kódu, ale len z konštruktorov
        // oddedených tried, ktoré zabezpečia načítanie špecifických informácií okolo tohoto načítania
        public void nacitajFilm(Scanner citac) {
                nazovFilmu = citac.nextLine();
                herci = new String[citac.nextInt()];
                citac.nextLine();
                for (int i = 0; i < herci.length; i++) {
                        herci[i] = citac.nextLine();
                }
                zanre = new String[citac.nextInt()];
                citac.nextLine();
                for (int i = 0; i < zanre.length; i++) {
                        zanre[i] = citac.nextLine();
                }
                dlzkaFilmu = citac.nextInt();
                citac.nextLine();
                hodnotenie = citac.nextDouble();
                citac.nextLine();
        }

        public boolean mamZaner(String zaner) {
                for (int i = 0; i < zanre.length; i++) {
                        if (zaner.equals(zanre[i])) {
                                return true;
                        }
                }
                return false;
        }

        public void setNazovFilmu(String nazovFilmu) {
                if (nazovFilmu != null)
                        this.nazovFilmu = nazovFilmu;
        }

        public void setDlzkaFilmu(int dlzkaFilmu) {
                if (dlzkaFilmu < 0)
                        dlzkaFilmu = 0;
                this.dlzkaFilmu = dlzkaFilmu;
        }

        public String getNazovFilmu() {
                return nazovFilmu;
        }

        public String[] getHerci() {
                return herci;
        }

        public void setHerci(String[] herci) {
                this.herci = herci;
        }

        public String[] getZanre() {
                return zanre;
        }

        public void setZanre(String[] zanre) {
                this.zanre = zanre;
        }

        public double getHodnotenie() {
                return hodnotenie;
        }

        public void setHodnotenie(double hodnotenie) {
                this.hodnotenie = hodnotenie;
        }

        public int getDlzkaFilmu() {
                return dlzkaFilmu;
        }
}

Trieda FilmNaDvd v balíčku sk.upjs.paz.filmy (súbor FilmNaDvd.java).

package sk.upjs.paz.filmy;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.Scanner;

public class FilmNaDvd extends Film implements Serializable{

        private int cisloDvd;

        // všetky inštančné premenné treba nastaviť cez settery
        public FilmNaDvd() {
        }

        // načíta cez Scanner zo súboru informácie o Dvd filme.
        // Najprv spracuje informácie o filme zavolaním rodičovskej metódy nacitajFilm
        // a potom dočíta ešte špecifiké dáta pre toto médium
        public FilmNaDvd(Scanner citac) {
                nacitajFilm(citac);
                cisloDvd = citac.nextInt();
                citac.nextLine();
                citac.nextLine();
        }

        public void setCisloDvd(int cisloDvd) {
                this.cisloDvd = cisloDvd;
        }

        // táto metóda je typicky volaná z metódy toString oddedenej z triedy Film
        // ale dá sa použiť aj priamo
        public String dajUmiestnenie() {
                return "DVD číslo " + cisloDvd;
        }

        // uloží cez PrintWriter do súboru informácie o Dvd filme
        // najprv zaznamená typ média, potom zapíše informácie o filme zavolaním rodičovskej
        // triedy ulozSa a nakoniec dopíše dáta špecifické pre toto médium
        public void ulozSa(PrintWriter pw) {
                pw.println("dvd");
                super.ulozSa(pw);
                pw.println(cisloDvd);
                pw.println();
        }       
}

Trieda FilmNaPaske v balíčku sk.upjs.paz.filmy (súbor FilmNaPaske.java).

package sk.upjs.paz.filmy;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.Scanner;

public class FilmNaPaske extends Film implements Serializable{

        private int cisloPasky;
        private int zaciatok;

        // tento konštruktor nastaví iba inštančné premenné zdedené od triedy Film
        // premenné cisloPasky a zaciatok treba nastavit cez settery
        public FilmNaPaske(String nazovFilmu, String[] herci, String[] zanre,
                        int dlzkaFilmu, double hodnotenie) {   
                super(nazovFilmu, herci, zanre, dlzkaFilmu, hodnotenie);
        }

        // načíta cez Scanner zo súboru informácie o filme na páske.
        // Najprv spracuje informácie o filme zavolaním rodičovskej metódy nacitajFilm
        // a potom dočíta ešte špecifiké dáta pre toto médium
        public FilmNaPaske(Scanner citac) {
                nacitajFilm(citac);
                cisloPasky = citac.nextInt();
                citac.nextLine();
                zaciatok = citac.nextInt();
                citac.nextLine();
                citac.nextLine();
        }

        // uloží cez PrintWriter do súboru informácie o filme na páske
        // najprv zaznamená typ média, potom zapíše informácie o filme zavolaním rodičovskej
        // triedy ulozSa a nakoniec dopíše dáta špecifické pre toto médium
        public void ulozSa(PrintWriter pw) {
                pw.println("paska");
                super.ulozSa(pw);
                pw.println(cisloPasky);
                pw.println(zaciatok);
                pw.println();
        }

        // táto metóda je typicky volaná z metódy toString oddedenej z triedy Film
        // ale dá sa použiť aj priamo
        public String dajUmiestnenie() {
                return "Páska číslo " + cisloPasky + " od "+ zaciatok +". minúty";
        }

        public void setCisloPasky(int cisloPasky) {
                this.cisloPasky = cisloPasky;
        }

        public void setZaciatok(int zaciatok) {
                this.zaciatok = zaciatok;
        }
}

Trieda FilmVPocitaci v balíčku sk.upjs.paz.filmy (súbor FilmVPocitaci.java).

package sk.upjs.paz.filmy;
import java.io.PrintWriter;
import java.io.Serializable;
import java.util.Scanner;


public class FilmVPocitaci extends Film implements Serializable{

        private String nazovPocitaca;
        private String cestaKSuboru;
        private int velkostSuboru;

        // tento konštruktor nastaví všetky inštančné premenné
        public FilmVPocitaci(String nazovFilmu, String[] herci, String[] zanre,
                        int dlzkaFilmu, double hodnotenie, String nazovPocitaca,
                        String cestaKSuboru, int velkostSuboru) {
                super(nazovFilmu, herci, zanre, dlzkaFilmu, hodnotenie);
                this.nazovPocitaca = nazovPocitaca;
                this.cestaKSuboru = cestaKSuboru;
                this.velkostSuboru = velkostSuboru;
        }

        // načíta cez Scanner zo súboru informácie o filme v počítači.
        // Najprv spracuje informácie o filme zavolaním rodičovskej metódy nacitajFilm
        // a potom dočíta ešte špecifiké dáta pre toto médium
        public FilmVPocitaci(Scanner citac) {
                nacitajFilm(citac);
                nazovPocitaca = citac.nextLine();
                cestaKSuboru = citac.nextLine();
                velkostSuboru = citac.nextInt();
                citac.nextLine();
                citac.nextLine();
        }

        // táto metóda je typicky volaná z metódy toString oddedenej z triedy Film
        // ale dá sa použiť aj priamo
        public String dajUmiestnenie() {
                return "Počítač " + nazovPocitaca+ " v súbore "+ cestaKSuboru;
        }

        // uloží cez PrintWriter do súboru informácie o filme na páske
        // najprv zaznamená typ média, potom zapíše informácie o filme zavolaním rodičovskej
        // triedy ulozSa a nakoniec dopíše dáta špecifické pre toto médium
        public void ulozSa(PrintWriter pw) {
                pw.println("pc");
                super.ulozSa(pw);
                pw.println(nazovPocitaca);
                pw.println(cestaKSuboru);
                pw.println(velkostSuboru);
                pw.println();
        }

        public int getVelkostSuboru() {
                return velkostSuboru;
        }
}

Interfejs ZoznamFilmov v balíčku sk.upjs.paz.filmy (súbor ZoznamFilmov.java).

package sk.upjs.paz.filmy;

public interface ZoznamFilmov {

        public void vypisVsetko();
        public void vypisPodlaZanru(String zaner);
        public void vlozNovyFilm(Film dvd);
        public void vymazFilm(String nazovFilmu);
        public void ulozSa();
        public void utriedPodlaNazvu();
        public void utriedPodlaDlzky();
        public void utriedPodlaHodnotenia();
}

Trieda TextovyZoznamFilmov v balíčku sk.upjs.paz.filmy (súbor TextovyZoznamFilmov.java) implementujúca interfejs ZoznamFilmov.

package sk.upjs.paz.filmy;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.Scanner;

import sk.upjs.paz.filmy.komparatory.FilmPodlaDlzkyComparator;
import sk.upjs.paz.filmy.komparatory.FilmPodlaHodnoteniaComparator;

public class TextovyZoznamFilmov implements ZoznamFilmov{

        private Film[] filmy;
        private String nazovSuboru;

        public TextovyZoznamFilmov(String nazovSuboru) {
                this();
                this.nazovSuboru = nazovSuboru;
                nacitajSa(nazovSuboru);
        }

        public TextovyZoznamFilmov() {
                filmy = new Film[0];
        }

        public void vlozNovyFilm(Film dvd) {
                Film[] novePole = new Film[filmy.length+1];
                System.arraycopy(filmy, 0, novePole, 0, filmy.length);
                novePole[filmy.length] = dvd;
                filmy = novePole;
        }

        public void vypisVsetko() {
                for (int i = 0; i < filmy.length; i++) {
                        System.out.println(filmy[i].toString());
                }
        }

        public void vypisPodlaZanru(String zaner) {
                for (int i = 0; i < filmy.length; i++) {
                        if (filmy[i].mamZaner(zaner)) {
                                System.out.println(filmy[i]);
                                System.out.println("=====================");
                        }
                }              
        }

        private void vymazFilm(Film dvd) {
                Film[] novePole = new Film[filmy.length-1];
                int pozicia = 0;
                while(filmy[pozicia] != dvd) {
                        if (pozicia == novePole.length) {
                                return;
                        }
                        novePole[pozicia] = filmy[pozicia];
                        pozicia++;
                }
                for(int i = pozicia+1; i < filmy.length; i++) {
                        novePole[i-1] = filmy[i];
                }
                filmy = novePole;
        }

        public void vymazFilm(String nazovFilmu) {
                int pozicia = 0;
                while ((pozicia < filmy.length) && (! filmy[pozicia].getNazovFilmu().equals(nazovFilmu))) {
                        pozicia++;     
                }
                if ((pozicia < filmy.length))
                        vymazFilm(filmy[pozicia]);
        }

        // metóda uloží celý zoznam filmov do súboru,
        // každý film sa zapisuje sám
        public void ulozSa(String subor) {
                File f = new File(subor);
                PrintWriter pw = null;
                try {
                        pw = new PrintWriter(f);
                        pw.println(filmy.length);
                        for (int i = 0; i < filmy.length; i++) {
                                filmy[i].ulozSa(pw);
                        }                      
                } catch (FileNotFoundException e) {
                        System.err.println("Subor neviem vyrobit, neulozilo sa nic.");
                } finally {
                        if (pw != null) {
                                pw.close();
                        }
                }
        }

        // metóda načíta celý zoznam filmov zo súboru
        // každý film si prečíta hodnoty a naplní svoje inštančné premenné sám
        // cez príslušný konštruktor
        public void nacitajSa(String subor) {
                File f = new File(subor);
                Scanner citac = null;
                filmy = new Film[0];
                try {
                        citac = new Scanner(f);
                        int dlzkaDb = citac.nextInt();
                        citac.nextLine();
                        for (int i = 0; i < dlzkaDb; i++) {
                                String typMedia = citac.nextLine();
                                if (typMedia.equals("dvd")) {
                                        vlozNovyFilm(new FilmNaDvd(citac));
                                }
                                if (typMedia.equals("paska")) {
                                        vlozNovyFilm(new FilmNaPaske(citac));
                                }
                                if (typMedia.equals("pc")) {
                                        vlozNovyFilm(new FilmVPocitaci(citac));
                                }                              
                        }
                } catch (FileNotFoundException e) {
                        System.err.println("Subor neviem precitat, zoznam filmov je prazdny.");
                } finally {
                        if (citac != null) {
                                citac.close();
                        }
                }              
        }

        @Override
        public void ulozSa() {
                ulozSa(nazovSuboru);
        }

        @Override
        public void utriedPodlaNazvu() {
                Arrays.sort(filmy);
        }

        @Override
        public void utriedPodlaDlzky() {
                Arrays.sort(filmy,new FilmPodlaDlzkyComparator());
        }

        @Override
        public void utriedPodlaHodnotenia() {
                Arrays.sort(filmy,new FilmPodlaHodnoteniaComparator());

        }
}

Trieda BinarnyZoznamFilmov v balíčku sk.upjs.paz.filmy (súbor BinarnyZoznamFilmov.java) implementujúca interfejs ZoznamFilmov.

package sk.upjs.paz.filmy;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;

import sk.upjs.paz.filmy.komparatory.FilmPodlaDlzkyComparator;
import sk.upjs.paz.filmy.komparatory.FilmPodlaHodnoteniaComparator;


public class BinarnyZoznamFilmov implements ZoznamFilmov {

        private Film[] filmy;
        private String nazovSuboru;

        public BinarnyZoznamFilmov(String nazovSuboru) {
                this();
                this.nazovSuboru = nazovSuboru;
                nacitajSa();
        }

        public BinarnyZoznamFilmov() {
                filmy = new Film[0];
        }

        public void ulozSa()  {
                File subor = new File(nazovSuboru);
                FileOutputStream fos = null;
                try {
                        fos = new FileOutputStream(subor);
                        ObjectOutputStream oos = new ObjectOutputStream(fos);
                        oos.writeObject(filmy);
                        oos.flush();
                        fos.flush();
                } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                finally {
                        if (fos != null) {
                                try {
                                        fos.close();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                }              
        }

        public void nacitajSa() {
                File subor = new File(nazovSuboru);
                FileInputStream fis = null;
                try {
                        fis = new FileInputStream(subor);
                        ObjectInputStream ois = new ObjectInputStream(fis);
                        filmy = (Film[]) ois.readObject();
                } catch (FileNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } catch (ClassNotFoundException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                } finally {
                        if (fis!= null) {
                                try {
                                        fis.close();
                                } catch (IOException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        }
                }
        }

        public void vlozNovyFilm(Film dvd) {
                Film[] novePole = new Film[filmy.length+1];
                System.arraycopy(filmy, 0, novePole, 0, filmy.length);
                novePole[filmy.length] = dvd;
                filmy = novePole;
        }

        public void vymazFilm(Film dvd) {
                Film[] novePole = new Film[filmy.length-1];
                int pozicia = 0;
                while(filmy[pozicia] != dvd) {
                        if (pozicia == novePole.length) {
                                return;
                        }
                        novePole[pozicia] = filmy[pozicia];
                        pozicia++;
                }
                for(int i = pozicia+1; i < filmy.length; i++) {
                        novePole[i-1] = filmy[i];
                }
                filmy = novePole;
        }

        public void vymazFilm(String nazovFilmu) {
                int pozicia = 0;
                while ((pozicia < filmy.length) && (! filmy[pozicia].getNazovFilmu().equals(nazovFilmu))) {
                        pozicia++;     
                }
                if ((pozicia < filmy.length))
                        vymazFilm(filmy[pozicia]);
        }

        public void vypisPodlaZanru(String zaner) {
                for (int i = 0; i < filmy.length; i++) {
                        if (filmy[i].mamZaner(zaner)) {
                                System.out.println(filmy[i]);
                                System.out.println("=====================");
                        }
                }              
        }

        public void vypisVsetko() {
                for (int i = 0; i < filmy.length; i++) {
                        System.out.println(filmy[i].toString());
                }
        }

        @Override
        public void utriedPodlaNazvu() {
                Arrays.sort(filmy,Collections.reverseOrder());
        }

        @Override
        public void utriedPodlaDlzky() {
                Arrays.sort(filmy,new FilmPodlaDlzkyComparator());
        }
        @Override
        public void utriedPodlaHodnotenia() {
                Comparator<Film> com = new FilmPodlaHodnoteniaComparator();
                Arrays.sort(filmy,Collections.reverseOrder(com));

        }

}

Trieda Spustac (súbor Spustac.java).

package sk.upjs.paz.filmy;
/* Matrix:
 * Herci:               Keanu Reeves, Laurence Fishburne, Carrie-Anne Moss
 * Žánre:             Akčný, Sci-Fi
 * Hotnotenie:  8.7
 * Dĺžka:             136
 *
 * The Shawshank Redemption:
 * Herci:               Tim Robbins, Morgan Freeman
 * Žánre:             Dráma
 * Hotnotenie:  9.2
 * Dĺžka:             142
 *
 * Fontána pre Zuzanu: 
 * Herci:               Eva Vejmělková, Jiří Bábek, Robo Grigorov
 * Žánre:             Dráma, Romantika, Muzikál
 * Hotnotenie:  6.3
 * Dĺžka:             81
 *
 * Pacho, hybský zbojník:
 * Herci:               Jozef Kroner, Marián Labuda
 * Žánre:             Komédia
 * Hotnotenie:  8.5
 * Dĺžka:             91
 */


public class Spustac {

        public static void main(String[] args) {
                FilmNaDvd pacho = new FilmNaDvd();
                pacho.setNazovFilmu("Pacho, hybský zbojník");
                pacho.setHodnotenie(9.5);
                pacho.setDlzkaFilmu(91);
                String[] herci = {"Jozef Kroner", "Marián Labuda"};
                pacho.setHerci(herci);
                String[] zanre = {"Komédia"};
                pacho.setZanre(zanre);
                pacho.setCisloDvd(50);

                String[] herci2 = {"Eva Vejmělková", "Jiří Bábek", "Robo Grigorov"};
                String[] zanre2 = {"Dráma", "Romantika", "Muzikál"};
                FilmNaPaske fontana = new FilmNaPaske("Fontána pre Zuzanu", herci2, zanre2, 81, 6.3);
                fontana.setCisloPasky(2);
                fontana.setZaciatok(92);

                String[] herci3 = {"Tim Robbins", "Morgan Freeman"};
                String[] zanre3 = {"Dráma"};
                FilmVPocitaci shawshank = new FilmVPocitaci("The Shawshank Redemption", herci3, zanre3, 142, 9.2,"Jozko","C:\\filmy\\shawshank.avi",700);

                String[] herci4 = {"Keanu Reeves", "Laurence Fishburne", "Carrie-Anne Moss"};
                String[] zanre4 = {"Akčný", "Sci-Fi"};
                FilmNaPaske matrix = new FilmNaPaske("The Matrix", herci4, zanre4, 136, 8.7);
                matrix.setCisloPasky(20);
                matrix.setZaciatok(0);

                ZoznamFilmov zoznam = new BinarnyZoznamFilmov();
                zoznam.vlozNovyFilm(pacho);
                zoznam.vlozNovyFilm(fontana);
                zoznam.vlozNovyFilm(shawshank);
                zoznam.vlozNovyFilm(matrix);

                zoznam.vypisVsetko();
                zoznam.utriedPodlaHodnotenia();
                System.out.println("+===========================");
                zoznam.vypisVsetko();
        }
}

Trieda FilmPodlaDlzkyComparator v balíčku sk.upjs.paz.filmy.komparatory (súbor FilmPodlaDlzkyComparator.java).

package sk.upjs.paz.filmy.komparatory;

import java.util.Comparator;

import sk.upjs.paz.filmy.Film;

public class FilmPodlaDlzkyComparator implements Comparator<Film> {

        @Override
        public int compare(Film film1, Film film2) {
                return film1.getDlzkaFilmu() - film2.getDlzkaFilmu();
        }

}

Trieda FilmPodlaHodnoteniaComparator v balíčku sk.upjs.paz.filmy.komparatory (súbor FilmPodlaHodnoteniaComparator.java).

package sk.upjs.paz.filmy.komparatory;

import java.util.Comparator;

import sk.upjs.paz.filmy.Film;

public class FilmPodlaHodnoteniaComparator implements Comparator<Film> {

        @Override
        public int compare(Film film1, Film film2) {
                return (int) Math.signum(film1.getHodnotenie() - film2.getHodnotenie());
        }

}

Trieda TriedicSpustac v balíčku sk.upjs.spustace (súbor TriedicSpustac.java).

package sk.upjs.spustace;

import java.util.Arrays;

public class TriedicSpustac {

        public static void main(String[] args) {
                int[] inty = {2,-8, 29,1};
                System.out.println(Arrays.toString(inty));
                Arrays.sort(inty);
                System.out.println(Arrays.toString(inty));

                String[] stringy = {"Jano", "Fero", "Rado" ,"Majka", "Peto"};
                System.out.println(Arrays.toString(stringy));
                Arrays.sort(stringy);
                System.out.println(Arrays.toString(stringy));
        }

}