gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Resenje zad-sort2
authorIvan Pribela <pribela@dmi.uns.ac.rs>
Sat, 31 Oct 2015 15:08:07 +0000 (16:08 +0100)
committerDoni Pracner <quinnuendo@gmail.com>
Sat, 31 Oct 2015 15:08:07 +0000 (16:08 +0100)
sortiranje/knjige/Biblioteka2.java [new file with mode: 0644]

diff --git a/sortiranje/knjige/Biblioteka2.java b/sortiranje/knjige/Biblioteka2.java
new file mode 100644 (file)
index 0000000..5a68014
--- /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
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner