gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system
summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: 951e0b3)
raw | patch | inline | side by side (parent: 951e0b3)
author | Ivan Pribela <pribela@dmi.uns.ac.rs> | |
Sat, 31 Oct 2015 15:08:07 +0000 (16:08 +0100) | ||
committer | Doni Pracner <quinnuendo@gmail.com> | |
Sat, 31 Oct 2015 15:08:07 +0000 (16:08 +0100) |
sortiranje/knjige/Biblioteka2.java | [new file with mode: 0644] | patch | blob |
diff --git a/sortiranje/knjige/Biblioteka2.java b/sortiranje/knjige/Biblioteka2.java
--- /dev/null
@@ -0,0 +1,261 @@
+/**\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
+// 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
+\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 toString() {\r
+ return id + " " + autor + ": " + naslov;\r
+ }\r
+\r
+ public int compareTo(Knjiga that) {\r
+ return this.id - that.id;\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
+\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
+\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
+\r
+ // Upisemo ukupan broj knjiga\r
+ fajl.println(niz.length);\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
+\r
+ // Zatvorimo fajl\r
+ Svetovid.closeOut(imeFajla);\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
+// 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
+}\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
+}\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
+}\r
+\r
+// Komparator koji daje obrnuti poredak u odnosu na originalni komparator\r
+// koji mu 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
+\r
+ @Override\r
+ public int compare(Knjiga knjiga1, Knjiga knjiga2) {\r
+\r
+ return -originalni.compare(knjiga1, knjiga2);\r
+ }\r
+}\r
+\r
+// Komparator koji prvo poredi pomocu primarnog komparatora a potom po\r
+// 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
+}\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
+}\r