gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system-/**\r
- * Resenje zadatka opisanog u zad-sort2, koji je prosirenje zad-sort1\r
- */\r
-\r
-import org.svetovid.io.*;\r
import java.util.Arrays;\r
import java.util.Comparator;\r
\r
+import org.svetovid.Svetovid;\r
+import org.svetovid.io.SvetovidReader;\r
+import org.svetovid.io.SvetovidWriter;\r
+\r
// Klasa koja opisuje jednu knjigu\r
class Knjiga implements Comparable<Knjiga> {\r
\r
- public final int id;\r
- public final String naslov;\r
- public final String autor;\r
+ // Osobine jednom kreirane knjige se ne mogu menjati\r
+ private final int id;\r
+ private final String naslov;\r
+ private final String autor;\r
+\r
+ public Knjiga(int id, String naslov, String autor) {\r
+ this.id = id;\r
+ this.naslov = naslov;\r
+ this.autor = autor;\r
+ }\r
+\r
+ public String getNaslov() {\r
+ return naslov;\r
+ }\r
+\r
+ public String getAutor() {\r
+ return autor;\r
+ }\r
+\r
+ public int getId() {\r
+ return id;\r
+ }\r
+\r
+ public String toString() {\r
+\r
+ // Tekstualna reprezentacija knjige oblika:\r
+ // 9785 J.R.R. Tolkien: The Lord of the Rings\r
+ return id + " " + autor + ": " + naslov;\r
\r
- public Knjiga(int id, String naslov, String autor) {\r
- this.id = id;\r
- this.naslov = naslov;\r
- this.autor = autor;\r
- }\r
+ }\r
\r
- public String toString() {\r
- return id + " " + autor + ": " + naslov;\r
- }\r
+ public int compareTo(Knjiga that) {\r
\r
- public int compareTo(Knjiga that) {\r
- return this.id - that.id;\r
- }\r
+ // Najjednostavnije poredjenje je po "id" broju\r
+ // return this.id - that.id;\r
+\r
+ // No mi ovde poredimo prvo po autoru\r
+ int rezultat = this.autor.compareTo(that.autor);\r
+\r
+ // A potom po naslovu, ako je sutor isti\r
+ if (rezultat == 0) {\r
+ rezultat = this.naslov.compareTo(that.naslov);\r
+ }\r
+\r
+ // Vracamo rezultat poredjenja\r
+ return rezultat;\r
+\r
+ }\r
}\r
\r
// Glavni program\r
public class Biblioteka2 {\r
\r
- public static void main(String[] arguments) {\r
-\r
- // Ucitavamo knjige iz fajla\r
- String imeFajla = Svetovid.in\r
- .readLine("Unesite ime fajla sa knjigama:");\r
- Knjiga[] niz = ucitajKnjige(imeFajla);\r
-\r
- // Ako nismo ucitali knjige, zavrsavamo program sa return\r
- if (niz == null) {\r
- Svetovid.out.println("Ne moze da se cita iz fajla " + imeFajla\r
- + ".");\r
- return;\r
- }\r
+ public static void main(String[] arguments) {\r
\r
- // Pitamo korisnika za kriterijum sortiranja\r
- Svetovid.out.println("Opcija 1: standardan sort bez komparatora");\r
- Svetovid.out.println("Opcija 2: sort sa opadajucim id knjige");\r
- Svetovid.out.println("Opcija 3: sort po naslovu");\r
- Svetovid.out.println("Opcija 4: sort po autoru, a zatim po naslovu");\r
- Svetovid.out.println("Za ostale opcije niz nece biti sortiran");\r
- Svetovid.out.print("Unesite opciju 1-4:");\r
- int opcija = Svetovid.in.readInt();\r
-\r
- // Sortiramo po odabranom kriterijumu\r
- switch (opcija) {\r
- case 1:\r
- Arrays.sort(niz);\r
- break;\r
- case 2:\r
- sortirajNiz(niz, new ObrnutiKomparator(new PrirodniKomparator()));\r
- break;\r
- case 3:\r
- sortirajNiz(niz, new KomparatorPoNaslovu());\r
- break;\r
- case 4:\r
- sortirajNiz(niz, new KomparatorPoAutoruIPotomNaslovu());\r
- break;\r
- default:\r
- Svetovid.out.println("Pogresna opcija! Niz nece biti sortiran.");\r
- }\r
+ // Ucitavamo knjige iz fajla\r
+ String imeFajla = Svetovid.in.readLine("Unesite ime fajla sa knjigama:");\r
+ Knjiga[] niz = ucitajKnjige(imeFajla);\r
\r
- // Stampamo niz\r
- stampajKnjige("Niz knjiga", niz);\r
-\r
- // Sacuvamo (sortirani) niz u novi fajl\r
- imeFajla = Svetovid.in.readLine("Unesite ime fajla za snimanje: ");\r
- boolean sacuvano = sacuvajKnjige(imeFajla, niz);\r
-\r
- // Ako nismo sacuvali knjige, prijavimo to korisniku\r
- if (!sacuvano) {\r
- Svetovid.out.println("Ne moze da se pise u fajl " + imeFajla + ".");\r
- }\r
-\r
- }\r
-\r
- public static Knjiga[] ucitajKnjige(String imeFajla) {\r
-\r
- // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige\r
- if (!Svetovid.testIn(imeFajla)) {\r
- return null;\r
- }\r
-\r
- // Ako mozemo, napravimo precicu 'in' da ne bi morali da\r
- // svaki put kuvamo 'Svetovid.in(imeFajla)'\r
- SvetovidReader in = Svetovid.in(imeFajla);\r
-\r
- // Koliko ima knjiga u fajlu?\r
- int br = in.readInt();\r
-\r
- // Napravimo niz odgovarajuce velicine\r
- Knjiga[] rez = new Knjiga[br];\r
-\r
- // Ucitamo knjige\r
- for (int i = 0; i < br; i++) {\r
-\r
- // Ucitamo podatke o knjizi\r
- int id = in.readInt();\r
- String naslov = in.readLine();\r
- String autor = in.readLine();\r
-\r
- // Napravimo knjigu\r
- Knjiga knjiga = new Knjiga(id, naslov, autor);\r
-\r
- // Dodamo knjigu u niz\r
- rez[i] = knjiga;\r
-\r
- }\r
-\r
- // Zatvorimo fajl\r
- in.close();\r
-\r
- // Vratimo ucitani niz\r
- return rez;\r
-\r
- }\r
-\r
- public static void stampajKnjige(String naslov, Knjiga[] niz) {\r
-\r
- // Odstampamo naslov\r
- Svetovid.out.println();\r
- Svetovid.out.println(naslov);\r
- Svetovid.out.println();\r
-\r
- // I potom sve knjige redom\r
- for (Knjiga knjiga : niz) {\r
- Svetovid.out.println(knjiga);\r
- }\r
-\r
- }\r
-\r
- public static boolean sacuvajKnjige(String imeFajla, Knjiga[] niz) {\r
-\r
- // Ako ne mozemo da otvorimo fajl, ne upisujemo knjige\r
- if (!Svetovid.testOut(imeFajla)) {\r
- return false;\r
- }\r
-\r
- // Ako mozemo, napravimo precicu 'out' da ne bi morali da\r
- // svaki put kuvamo 'Svetovid.out(imeFajla)'\r
- SvetovidWriter fajl = Svetovid.out(imeFajla);\r
+ // Ako nismo ucitali knjige, zavrsavamo program sa return\r
+ if (niz == null) {\r
+ Svetovid.out.println("Ne moze da se cita iz fajla " + imeFajla + ".");\r
+ return;\r
+ }\r
\r
- // Upisemo ukupan broj knjiga\r
- fajl.println(niz.length);\r
+ // Pitamo korisnika za kriterijum sortiranja\r
+ Svetovid.out.println("Opcija 1: standardan sort bez komparatora");\r
+ Svetovid.out.println("Opcija 2: sort sa opadajucim id knjige");\r
+ Svetovid.out.println("Opcija 3: sort po naslovu");\r
+ Svetovid.out.println("Opcija 4: sort po autoru, a zatim po naslovu");\r
+ Svetovid.out.println("Za ostale opcije niz nece biti sortiran");\r
+ Svetovid.out.print("Unesite opciju 1-4:");\r
+ int opcija = Svetovid.in.readInt();\r
\r
- // I potom podatke za svaku knjigu\r
- for (Knjiga k : niz) {\r
- fajl.println(k.id);\r
- fajl.println(k.naslov);\r
- fajl.println(k.autor);\r
- }\r
+ // Sortiramo po odabranom kriterijumu\r
+ switch (opcija) {\r
+ case 1:\r
+ Arrays.sort(niz);\r
+ break;\r
+ case 2:\r
+ sortirajNiz(niz, new ObrnutiKomparator(new PrirodniKomparator()));\r
+ break;\r
+ case 3:\r
+ sortirajNiz(niz, new KomparatorPoNaslovu());\r
+ break;\r
+ case 4:\r
+ sortirajNiz(niz, new KomparatorPoAutoruIPotomNaslovu());\r
+ break;\r
+ default:\r
+ Svetovid.out.println("Pogresna opcija! Niz nece biti sortiran.");\r
+ }\r
\r
- // Zatvorimo fajl\r
- Svetovid.closeOut(imeFajla);\r
+ // Stampamo niz\r
+ stampajKnjige("Niz knjiga", niz);\r
\r
- // Javimo da smo uspesno sacuvali knjige\r
- return true;\r
+ // Sacuvamo (sortirani) niz u novi fajl\r
+ imeFajla = Svetovid.in.readLine("Unesite ime fajla za snimanje: ");\r
+ boolean sacuvano = sacuvajKnjige(imeFajla, niz);\r
+\r
+ // Ako nismo sacuvali knjige, prijavimo to korisniku\r
+ if (!sacuvano) {\r
+ Svetovid.out.println("Ne moze da se pise u fajl " + imeFajla + ".");\r
+ }\r
+\r
+ }\r
+\r
+ public static Knjiga[] ucitajKnjige(String imeFajla) {\r
+\r
+ // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige\r
+ if (!Svetovid.testIn(imeFajla)) {\r
+ return null;\r
+ }\r
+\r
+ // Ako mozemo, napravimo precicu 'in' da ne bi morali da\r
+ // svaki put kucamo 'Svetovid.in(imeFajla)'\r
+ SvetovidReader in = Svetovid.in(imeFajla);\r
+\r
+ // Koliko ima knjiga u fajlu?\r
+ int br = in.readInt();\r
+\r
+ // Napravimo niz odgovarajuce velicine\r
+ Knjiga[] rez = new Knjiga[br];\r
+\r
+ // Ucitamo knjige\r
+ for (int i = 0; i < br; i++) {\r
+\r
+ // Ucitamo podatke o knjizi\r
+ int id = in.readInt();\r
+ String naslov = in.readLine();\r
+ String autor = in.readLine();\r
+\r
+ // Napravimo knjigu\r
+ Knjiga knjiga = new Knjiga(id, naslov, autor);\r
+\r
+ // Dodamo knjigu u niz\r
+ rez[i] = knjiga;\r
+\r
+ }\r
+\r
+ // Zatvorimo fajl\r
+ in.close();\r
+\r
+ // Vratimo ucitani niz\r
+ return rez;\r
+\r
+ }\r
+\r
+ public static void stampajKnjige(String naslov, Knjiga[] niz) {\r
+\r
+ // Odstampamo naslov\r
+ Svetovid.out.println();\r
+ Svetovid.out.println(naslov);\r
+ Svetovid.out.println();\r
+\r
+ // I potom sve knjige redom\r
+ for (Knjiga knjiga : niz) {\r
+ Svetovid.out.println(knjiga);\r
+ }\r
+\r
+ }\r
+\r
+ public static boolean sacuvajKnjige(String imeFajla, Knjiga[] niz) {\r
+\r
+ // Ako ne mozemo da otvorimo fajl, ne upisujemo knjige\r
+ if (!Svetovid.testOut(imeFajla)) {\r
+ return false;\r
+ }\r
+\r
+ // Ako mozemo, napravimo precicu 'out' da ne bi morali da\r
+ // svaki put kucamo 'Svetovid.out(imeFajla)'\r
+ SvetovidWriter fajl = Svetovid.out(imeFajla);\r
+\r
+ // Upisemo ukupan broj knjiga\r
+ fajl.println(niz.length);\r
+\r
+ // I potom podatke za svaku knjigu\r
+ for (Knjiga knjiga : niz) {\r
+ fajl.println(knjiga.getId());\r
+ fajl.println(knjiga.getNaslov());\r
+ fajl.println(knjiga.getAutor());\r
+ }\r
\r
- }\r
+ // Zatvorimo fajl\r
+ Svetovid.closeOut(imeFajla);\r
\r
- public static void sortirajNiz(Knjiga[] niz, Comparator<Knjiga> c) {\r
- Knjiga tmp;\r
- for (int i = niz.length - 1; i > 0; i--)\r
- for (int j = 0; j < i; j++)\r
- if (c.compare(niz[j], niz[i]) > 0) {\r
- tmp = niz[j];\r
- niz[j] = niz[i];\r
- niz[i] = tmp;\r
- }\r
- }\r
+ // Javimo da smo uspesno sacuvali knjige\r
+ return true;\r
+\r
+ }\r
+\r
+ public static void sortirajNiz(Knjiga[] niz, Comparator<Knjiga> c) {\r
+ Knjiga tmp;\r
+ for (int i = niz.length - 1; i > 0; i--) {\r
+ for (int j = 0; j < i; j++) {\r
+ if (c.compare(niz[j], niz[i]) > 0) {\r
+ tmp = niz[j];\r
+ niz[j] = niz[i];\r
+ niz[i] = tmp;\r
+ }\r
+ }\r
+ }\r
+ }\r
\r
}\r
\r
// Komparator koji poredi knjige po naslovu\r
class KomparatorPoNaslovu implements Comparator<Knjiga> {\r
\r
- @Override\r
- public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
- int rezultat = knjiga1.naslov.compareTo(knjiga2.naslov);\r
- return rezultat;\r
- }\r
+ @Override\r
+ public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
+ int rezultat = knjiga1.getNaslov().compareTo(knjiga2.getNaslov());\r
+ return rezultat;\r
+ }\r
}\r
\r
// Komparator koji poredi knjige po naslovu\r
class KomparatorPoAutoru implements Comparator<Knjiga> {\r
\r
- @Override\r
- public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
- int rezultat = knjiga1.autor.compareTo(knjiga2.autor);\r
- return rezultat;\r
- }\r
+ @Override\r
+ public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
+ int rezultat = knjiga1.getAutor().compareTo(knjiga2.getAutor());\r
+ return rezultat;\r
+ }\r
}\r
\r
// Komparator koji koristi prirodni poredak, tj. samo poziva compareTo()\r
class PrirodniKomparator implements Comparator<Knjiga> {\r
\r
- @Override\r
- public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
- return knjiga1.compareTo(knjiga2);\r
- }\r
+ @Override\r
+ public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
+ return knjiga1.compareTo(knjiga2);\r
+ }\r
}\r
\r
// Komparator koji daje obrnuti poredak u odnosu na originalni komparator\r
-// koji mu je prosledjen u konstruktoru\r
+// koji je prosledjen u konstruktoru\r
class ObrnutiKomparator implements Comparator<Knjiga> {\r
\r
- private final Comparator<Knjiga> originalni;\r
-\r
- public ObrnutiKomparator(Comparator<Knjiga> originalni) {\r
- this.originalni = originalni;\r
- }\r
+ private final Comparator<Knjiga> originalni;\r
\r
- @Override\r
- public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
+ public ObrnutiKomparator(Comparator<Knjiga> originalni) {\r
+ this.originalni = originalni;\r
+ }\r
\r
- return -originalni.compare(knjiga1, knjiga2);\r
- }\r
+ @Override\r
+ public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
+ return -originalni.compare(knjiga1, knjiga2);\r
+ }\r
}\r
\r
-// Komparator koji prvo poredi pomocu primarnog komparatora a potom po\r
-// sekundarnom\r
+// Komparator koji prvo poredi pomocu primarnog komparatora a potom po sekundarnom\r
class KompozitniKomparator implements Comparator<Knjiga> {\r
\r
- private final Comparator<Knjiga> primarni;\r
- private final Comparator<Knjiga> sekundarni;\r
-\r
- public KompozitniKomparator(Comparator<Knjiga> primarni,\r
- Comparator<Knjiga> sekundarni) {\r
- this.primarni = primarni;\r
- this.sekundarni = sekundarni;\r
- }\r
-\r
- @Override\r
- public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
- int rezultat = primarni.compare(knjiga1, knjiga2);\r
- if (rezultat == 0) {\r
- rezultat = sekundarni.compare(knjiga1, knjiga2);\r
- }\r
- return rezultat;\r
- }\r
+ private final Comparator<Knjiga> primarni;\r
+ private final Comparator<Knjiga> sekundarni;\r
+\r
+ public KompozitniKomparator(Comparator<Knjiga> primarni, Comparator<Knjiga> sekundarni) {\r
+ this.primarni = primarni;\r
+ this.sekundarni = sekundarni;\r
+ }\r
+\r
+ @Override\r
+ public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
+ int rezultat = primarni.compare(knjiga1, knjiga2);\r
+ if (rezultat == 0) {\r
+ rezultat = sekundarni.compare(knjiga1, knjiga2);\r
+ }\r
+ return rezultat;\r
+ }\r
}\r
\r
// Komparator koji poredi po autoru, a za iste autore, po naslovu\r
class KomparatorPoAutoruIPotomNaslovu extends KompozitniKomparator {\r
\r
- public KomparatorPoAutoruIPotomNaslovu() {\r
- super(new KomparatorPoAutoru(), new KomparatorPoNaslovu());\r
- }\r
+ public KomparatorPoAutoruIPotomNaslovu() {\r
+ super(new KomparatorPoAutoru(), new KomparatorPoNaslovu());\r
+ }\r
}\r