X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=spa2-materijali.git;a=blobdiff_plain;f=sortiranje%2Fknjige%2FBiblioteka2.java;h=ff33aeb1ca89614ac5e01f07d7031de2ba090c71;hp=5a680142aeb7c0b0441f43f351dc0d7fbe9161d3;hb=d85081749679b32f3bdbccc90d45c6c89d49bbc5;hpb=299e9c29198ce76487d0ef651e74d84066d415ce diff --git a/sortiranje/knjige/Biblioteka2.java b/sortiranje/knjige/Biblioteka2.java index 5a68014..ff33aeb 100644 --- a/sortiranje/knjige/Biblioteka2.java +++ b/sortiranje/knjige/Biblioteka2.java @@ -9,253 +9,249 @@ import java.util.Comparator; // Klasa koja opisuje jednu knjigu class Knjiga implements Comparable { - public final int id; - public final String naslov; - public final String autor; - - public Knjiga(int id, String naslov, String autor) { - this.id = id; - this.naslov = naslov; - this.autor = autor; - } - - public String toString() { - return id + " " + autor + ": " + naslov; - } - - public int compareTo(Knjiga that) { - return this.id - that.id; - } + public final int id; + public final String naslov; + public final String autor; + + public Knjiga(int id, String naslov, String autor) { + this.id = id; + this.naslov = naslov; + this.autor = autor; + } + + public String toString() { + return id + " " + autor + ": " + naslov; + } + + public int compareTo(Knjiga that) { + return this.id - that.id; + } } // Glavni program public class Biblioteka2 { - public static void main(String[] arguments) { - - // Ucitavamo knjige iz fajla - String imeFajla = Svetovid.in - .readLine("Unesite ime fajla sa knjigama:"); - Knjiga[] niz = ucitajKnjige(imeFajla); - - // Ako nismo ucitali knjige, zavrsavamo program sa return - if (niz == null) { - Svetovid.out.println("Ne moze da se cita iz fajla " + imeFajla - + "."); - return; - } + public static void main(String[] arguments) { - // Pitamo korisnika za kriterijum sortiranja - Svetovid.out.println("Opcija 1: standardan sort bez komparatora"); - Svetovid.out.println("Opcija 2: sort sa opadajucim id knjige"); - Svetovid.out.println("Opcija 3: sort po naslovu"); - Svetovid.out.println("Opcija 4: sort po autoru, a zatim po naslovu"); - Svetovid.out.println("Za ostale opcije niz nece biti sortiran"); - Svetovid.out.print("Unesite opciju 1-4:"); - int opcija = Svetovid.in.readInt(); - - // Sortiramo po odabranom kriterijumu - switch (opcija) { - case 1: - Arrays.sort(niz); - break; - case 2: - sortirajNiz(niz, new ObrnutiKomparator(new PrirodniKomparator())); - break; - case 3: - sortirajNiz(niz, new KomparatorPoNaslovu()); - break; - case 4: - sortirajNiz(niz, new KomparatorPoAutoruIPotomNaslovu()); - break; - default: - Svetovid.out.println("Pogresna opcija! Niz nece biti sortiran."); - } + // Ucitavamo knjige iz fajla + String imeFajla = Svetovid.in.readLine("Unesite ime fajla sa knjigama:"); + Knjiga[] niz = ucitajKnjige(imeFajla); - // Stampamo niz - stampajKnjige("Niz knjiga", niz); - - // Sacuvamo (sortirani) niz u novi fajl - imeFajla = Svetovid.in.readLine("Unesite ime fajla za snimanje: "); - boolean sacuvano = sacuvajKnjige(imeFajla, niz); - - // Ako nismo sacuvali knjige, prijavimo to korisniku - if (!sacuvano) { - Svetovid.out.println("Ne moze da se pise u fajl " + imeFajla + "."); - } - - } - - public static Knjiga[] ucitajKnjige(String imeFajla) { - - // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige - if (!Svetovid.testIn(imeFajla)) { - return null; - } - - // Ako mozemo, napravimo precicu 'in' da ne bi morali da - // svaki put kuvamo 'Svetovid.in(imeFajla)' - SvetovidReader in = Svetovid.in(imeFajla); - - // Koliko ima knjiga u fajlu? - int br = in.readInt(); - - // Napravimo niz odgovarajuce velicine - Knjiga[] rez = new Knjiga[br]; - - // Ucitamo knjige - for (int i = 0; i < br; i++) { - - // Ucitamo podatke o knjizi - int id = in.readInt(); - String naslov = in.readLine(); - String autor = in.readLine(); - - // Napravimo knjigu - Knjiga knjiga = new Knjiga(id, naslov, autor); - - // Dodamo knjigu u niz - rez[i] = knjiga; - - } - - // Zatvorimo fajl - in.close(); - - // Vratimo ucitani niz - return rez; - - } - - public static void stampajKnjige(String naslov, Knjiga[] niz) { - - // Odstampamo naslov - Svetovid.out.println(); - Svetovid.out.println(naslov); - Svetovid.out.println(); - - // I potom sve knjige redom - for (Knjiga knjiga : niz) { - Svetovid.out.println(knjiga); - } - - } - - public static boolean sacuvajKnjige(String imeFajla, Knjiga[] niz) { - - // Ako ne mozemo da otvorimo fajl, ne upisujemo knjige - if (!Svetovid.testOut(imeFajla)) { - return false; - } - - // Ako mozemo, napravimo precicu 'out' da ne bi morali da - // svaki put kuvamo 'Svetovid.out(imeFajla)' - SvetovidWriter fajl = Svetovid.out(imeFajla); + // Ako nismo ucitali knjige, zavrsavamo program sa return + if (niz == null) { + Svetovid.out.println("Ne moze da se cita iz fajla " + imeFajla + "."); + return; + } - // Upisemo ukupan broj knjiga - fajl.println(niz.length); + // Pitamo korisnika za kriterijum sortiranja + Svetovid.out.println("Opcija 1: standardan sort bez komparatora"); + Svetovid.out.println("Opcija 2: sort sa opadajucim id knjige"); + Svetovid.out.println("Opcija 3: sort po naslovu"); + Svetovid.out.println("Opcija 4: sort po autoru, a zatim po naslovu"); + Svetovid.out.println("Za ostale opcije niz nece biti sortiran"); + Svetovid.out.print("Unesite opciju 1-4:"); + int opcija = Svetovid.in.readInt(); - // I potom podatke za svaku knjigu - for (Knjiga k : niz) { - fajl.println(k.id); - fajl.println(k.naslov); - fajl.println(k.autor); - } + // Sortiramo po odabranom kriterijumu + switch (opcija) { + case 1: + Arrays.sort(niz); + break; + case 2: + sortirajNiz(niz, new ObrnutiKomparator(new PrirodniKomparator())); + break; + case 3: + sortirajNiz(niz, new KomparatorPoNaslovu()); + break; + case 4: + sortirajNiz(niz, new KomparatorPoAutoruIPotomNaslovu()); + break; + default: + Svetovid.out.println("Pogresna opcija! Niz nece biti sortiran."); + } - // Zatvorimo fajl - Svetovid.closeOut(imeFajla); + // Stampamo niz + stampajKnjige("Niz knjiga", niz); - // Javimo da smo uspesno sacuvali knjige - return true; + // Sacuvamo (sortirani) niz u novi fajl + imeFajla = Svetovid.in.readLine("Unesite ime fajla za snimanje: "); + boolean sacuvano = sacuvajKnjige(imeFajla, niz); + + // Ako nismo sacuvali knjige, prijavimo to korisniku + if (!sacuvano) { + Svetovid.out.println("Ne moze da se pise u fajl " + imeFajla + "."); + } + + } + + public static Knjiga[] ucitajKnjige(String imeFajla) { + + // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige + if (!Svetovid.testIn(imeFajla)) { + return null; + } + + // Ako mozemo, napravimo precicu 'in' da ne bi morali da + // svaki put kuvamo 'Svetovid.in(imeFajla)' + SvetovidReader in = Svetovid.in(imeFajla); + + // Koliko ima knjiga u fajlu? + int br = in.readInt(); + + // Napravimo niz odgovarajuce velicine + Knjiga[] rez = new Knjiga[br]; + + // Ucitamo knjige + for (int i = 0; i < br; i++) { + + // Ucitamo podatke o knjizi + int id = in.readInt(); + String naslov = in.readLine(); + String autor = in.readLine(); + + // Napravimo knjigu + Knjiga knjiga = new Knjiga(id, naslov, autor); + + // Dodamo knjigu u niz + rez[i] = knjiga; + + } + + // Zatvorimo fajl + in.close(); + + // Vratimo ucitani niz + return rez; + + } + + public static void stampajKnjige(String naslov, Knjiga[] niz) { + + // Odstampamo naslov + Svetovid.out.println(); + Svetovid.out.println(naslov); + Svetovid.out.println(); + + // I potom sve knjige redom + for (Knjiga knjiga : niz) { + Svetovid.out.println(knjiga); + } + + } + + public static boolean sacuvajKnjige(String imeFajla, Knjiga[] niz) { + + // Ako ne mozemo da otvorimo fajl, ne upisujemo knjige + if (!Svetovid.testOut(imeFajla)) { + return false; + } + + // Ako mozemo, napravimo precicu 'out' da ne bi morali da + // svaki put kucamo 'Svetovid.out(imeFajla)' + SvetovidWriter fajl = Svetovid.out(imeFajla); - } + // Upisemo ukupan broj knjiga + fajl.println(niz.length); - public static void sortirajNiz(Knjiga[] niz, Comparator c) { - Knjiga tmp; - for (int i = niz.length - 1; i > 0; i--) - for (int j = 0; j < i; j++) - if (c.compare(niz[j], niz[i]) > 0) { - tmp = niz[j]; - niz[j] = niz[i]; - niz[i] = tmp; - } - } + // I potom podatke za svaku knjigu + for (Knjiga k : niz) { + fajl.println(k.id); + fajl.println(k.naslov); + fajl.println(k.autor); + } + + // Zatvorimo fajl + Svetovid.closeOut(imeFajla); + + // Javimo da smo uspesno sacuvali knjige + return true; + + } + + public static void sortirajNiz(Knjiga[] niz, Comparator c) { + Knjiga tmp; + for (int i = niz.length - 1; i > 0; i--) + for (int j = 0; j < i; j++) + if (c.compare(niz[j], niz[i]) > 0) { + tmp = niz[j]; + niz[j] = niz[i]; + niz[i] = tmp; + } + } } -// Komparator koji poredi knjige po naslovu +// Koparator koji poredi knjige po naslovu class KomparatorPoNaslovu implements Comparator { - @Override - public int compare(Knjiga knjiga1, Knjiga knjiga2) { - int rezultat = knjiga1.naslov.compareTo(knjiga2.naslov); - return rezultat; - } + @Override + public int compare(Knjiga knjiga1, Knjiga knjiga2) { + int rezultat = knjiga1.naslov.compareTo(knjiga2.naslov); + return rezultat; + } } -// Komparator koji poredi knjige po naslovu +// Koparator koji poredi knjige po naslovu class KomparatorPoAutoru implements Comparator { - @Override - public int compare(Knjiga knjiga1, Knjiga knjiga2) { - int rezultat = knjiga1.autor.compareTo(knjiga2.autor); - return rezultat; - } + @Override + public int compare(Knjiga knjiga1, Knjiga knjiga2) { + int rezultat = knjiga1.autor.compareTo(knjiga2.autor); + return rezultat; + } } -// Komparator koji koristi prirodni poredak, tj. samo poziva compareTo() +// Koparator koji koristi prirodni poredak, tj. samo poziva compareTo() class PrirodniKomparator implements Comparator { - @Override - public int compare(Knjiga knjiga1, Knjiga knjiga2) { - return knjiga1.compareTo(knjiga2); - } + @Override + public int compare(Knjiga knjiga1, Knjiga knjiga2) { + return knjiga1.compareTo(knjiga2); + } } // Komparator koji daje obrnuti poredak u odnosu na originalni komparator -// koji mu je prosledjen u konstruktoru class ObrnutiKomparator implements Comparator { - private final Comparator originalni; + private final Comparator originalni; - public ObrnutiKomparator(Comparator originalni) { - this.originalni = originalni; - } + public ObrnutiKomparator(Comparator originalni) { + this.originalni = originalni; + } - @Override - public int compare(Knjiga knjiga1, Knjiga knjiga2) { + @Override + public int compare(Knjiga knjiga1, Knjiga knjiga2) { - return -originalni.compare(knjiga1, knjiga2); - } + return -originalni.compare(knjiga1, knjiga2); + } } -// Komparator koji prvo poredi pomocu primarnog komparatora a potom po -// sekundarnom +// Komparator koji prvo poredi pomocu primarnog komparatora a potom po sekundarnom class KompozitniKomparator implements Comparator { - private final Comparator primarni; - private final Comparator sekundarni; - - public KompozitniKomparator(Comparator primarni, - Comparator sekundarni) { - this.primarni = primarni; - this.sekundarni = sekundarni; - } - - @Override - public int compare(Knjiga knjiga1, Knjiga knjiga2) { - int rezultat = primarni.compare(knjiga1, knjiga2); - if (rezultat == 0) { - rezultat = sekundarni.compare(knjiga1, knjiga2); - } - return rezultat; - } + private final Comparator primarni; + private final Comparator sekundarni; + + public KompozitniKomparator(Comparator primarni, + Comparator sekundarni) { + this.primarni = primarni; + this.sekundarni = sekundarni; + } + + @Override + public int compare(Knjiga knjiga1, Knjiga knjiga2) { + int rezultat = primarni.compare(knjiga1, knjiga2); + if (rezultat == 0) { + rezultat = sekundarni.compare(knjiga1, knjiga2); + } + return rezultat; + } } // Komparator koji poredi po autoru, a za iste autore, po naslovu class KomparatorPoAutoruIPotomNaslovu extends KompozitniKomparator { - public KomparatorPoAutoruIPotomNaslovu() { - super(new KomparatorPoAutoru(), new KomparatorPoNaslovu()); - } + public KomparatorPoAutoruIPotomNaslovu() { + super(new KomparatorPoAutoru(), new KomparatorPoNaslovu()); + } }