gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
ff33aeb1ca89614ac5e01f07d7031de2ba090c71
[spa2-materijali.git] / sortiranje / knjige / Biblioteka2.java
1 /**
2 * Resenje zadatka opisanog u zad-sort2, koji je prosirenje zad-sort1
3 */
5 import org.svetovid.io.*;
6 import java.util.Arrays;
7 import java.util.Comparator;
9 // Klasa koja opisuje jednu knjigu
10 class Knjiga implements Comparable<Knjiga> {
12 public final int id;
13 public final String naslov;
14 public final String autor;
16 public Knjiga(int id, String naslov, String autor) {
17 this.id = id;
18 this.naslov = naslov;
19 this.autor = autor;
20 }
22 public String toString() {
23 return id + " " + autor + ": " + naslov;
24 }
26 public int compareTo(Knjiga that) {
27 return this.id - that.id;
28 }
29 }
31 // Glavni program
32 public class Biblioteka2 {
34 public static void main(String[] arguments) {
36 // Ucitavamo knjige iz fajla
37 String imeFajla = Svetovid.in.readLine("Unesite ime fajla sa knjigama:");
38 Knjiga[] niz = ucitajKnjige(imeFajla);
40 // Ako nismo ucitali knjige, zavrsavamo program sa return
41 if (niz == null) {
42 Svetovid.out.println("Ne moze da se cita iz fajla " + imeFajla + ".");
43 return;
44 }
46 // Pitamo korisnika za kriterijum sortiranja
47 Svetovid.out.println("Opcija 1: standardan sort bez komparatora");
48 Svetovid.out.println("Opcija 2: sort sa opadajucim id knjige");
49 Svetovid.out.println("Opcija 3: sort po naslovu");
50 Svetovid.out.println("Opcija 4: sort po autoru, a zatim po naslovu");
51 Svetovid.out.println("Za ostale opcije niz nece biti sortiran");
52 Svetovid.out.print("Unesite opciju 1-4:");
53 int opcija = Svetovid.in.readInt();
55 // Sortiramo po odabranom kriterijumu
56 switch (opcija) {
57 case 1:
58 Arrays.sort(niz);
59 break;
60 case 2:
61 sortirajNiz(niz, new ObrnutiKomparator(new PrirodniKomparator()));
62 break;
63 case 3:
64 sortirajNiz(niz, new KomparatorPoNaslovu());
65 break;
66 case 4:
67 sortirajNiz(niz, new KomparatorPoAutoruIPotomNaslovu());
68 break;
69 default:
70 Svetovid.out.println("Pogresna opcija! Niz nece biti sortiran.");
71 }
73 // Stampamo niz
74 stampajKnjige("Niz knjiga", niz);
76 // Sacuvamo (sortirani) niz u novi fajl
77 imeFajla = Svetovid.in.readLine("Unesite ime fajla za snimanje: ");
78 boolean sacuvano = sacuvajKnjige(imeFajla, niz);
80 // Ako nismo sacuvali knjige, prijavimo to korisniku
81 if (!sacuvano) {
82 Svetovid.out.println("Ne moze da se pise u fajl " + imeFajla + ".");
83 }
85 }
87 public static Knjiga[] ucitajKnjige(String imeFajla) {
89 // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige
90 if (!Svetovid.testIn(imeFajla)) {
91 return null;
92 }
94 // Ako mozemo, napravimo precicu 'in' da ne bi morali da
95 // svaki put kuvamo 'Svetovid.in(imeFajla)'
96 SvetovidReader in = Svetovid.in(imeFajla);
98 // Koliko ima knjiga u fajlu?
99 int br = in.readInt();
101 // Napravimo niz odgovarajuce velicine
102 Knjiga[] rez = new Knjiga[br];
104 // Ucitamo knjige
105 for (int i = 0; i < br; i++) {
107 // Ucitamo podatke o knjizi
108 int id = in.readInt();
109 String naslov = in.readLine();
110 String autor = in.readLine();
112 // Napravimo knjigu
113 Knjiga knjiga = new Knjiga(id, naslov, autor);
115 // Dodamo knjigu u niz
116 rez[i] = knjiga;
120 // Zatvorimo fajl
121 in.close();
123 // Vratimo ucitani niz
124 return rez;
128 public static void stampajKnjige(String naslov, Knjiga[] niz) {
130 // Odstampamo naslov
131 Svetovid.out.println();
132 Svetovid.out.println(naslov);
133 Svetovid.out.println();
135 // I potom sve knjige redom
136 for (Knjiga knjiga : niz) {
137 Svetovid.out.println(knjiga);
142 public static boolean sacuvajKnjige(String imeFajla, Knjiga[] niz) {
144 // Ako ne mozemo da otvorimo fajl, ne upisujemo knjige
145 if (!Svetovid.testOut(imeFajla)) {
146 return false;
149 // Ako mozemo, napravimo precicu 'out' da ne bi morali da
150 // svaki put kucamo 'Svetovid.out(imeFajla)'
151 SvetovidWriter fajl = Svetovid.out(imeFajla);
153 // Upisemo ukupan broj knjiga
154 fajl.println(niz.length);
156 // I potom podatke za svaku knjigu
157 for (Knjiga k : niz) {
158 fajl.println(k.id);
159 fajl.println(k.naslov);
160 fajl.println(k.autor);
163 // Zatvorimo fajl
164 Svetovid.closeOut(imeFajla);
166 // Javimo da smo uspesno sacuvali knjige
167 return true;
171 public static void sortirajNiz(Knjiga[] niz, Comparator<Knjiga> c) {
172 Knjiga tmp;
173 for (int i = niz.length - 1; i > 0; i--)
174 for (int j = 0; j < i; j++)
175 if (c.compare(niz[j], niz[i]) > 0) {
176 tmp = niz[j];
177 niz[j] = niz[i];
178 niz[i] = tmp;
184 // Koparator koji poredi knjige po naslovu
185 class KomparatorPoNaslovu implements Comparator<Knjiga> {
187 @Override
188 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
189 int rezultat = knjiga1.naslov.compareTo(knjiga2.naslov);
190 return rezultat;
194 // Koparator koji poredi knjige po naslovu
195 class KomparatorPoAutoru implements Comparator<Knjiga> {
197 @Override
198 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
199 int rezultat = knjiga1.autor.compareTo(knjiga2.autor);
200 return rezultat;
204 // Koparator koji koristi prirodni poredak, tj. samo poziva compareTo()
205 class PrirodniKomparator implements Comparator<Knjiga> {
207 @Override
208 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
209 return knjiga1.compareTo(knjiga2);
213 // Komparator koji daje obrnuti poredak u odnosu na originalni komparator
214 class ObrnutiKomparator implements Comparator<Knjiga> {
216 private final Comparator<Knjiga> originalni;
218 public ObrnutiKomparator(Comparator<Knjiga> originalni) {
219 this.originalni = originalni;
222 @Override
223 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
225 return -originalni.compare(knjiga1, knjiga2);
229 // Komparator koji prvo poredi pomocu primarnog komparatora a potom po sekundarnom
230 class KompozitniKomparator implements Comparator<Knjiga> {
232 private final Comparator<Knjiga> primarni;
233 private final Comparator<Knjiga> sekundarni;
235 public KompozitniKomparator(Comparator<Knjiga> primarni,
236 Comparator<Knjiga> sekundarni) {
237 this.primarni = primarni;
238 this.sekundarni = sekundarni;
241 @Override
242 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
243 int rezultat = primarni.compare(knjiga1, knjiga2);
244 if (rezultat == 0) {
245 rezultat = sekundarni.compare(knjiga1, knjiga2);
247 return rezultat;
251 // Komparator koji poredi po autoru, a za iste autore, po naslovu
252 class KomparatorPoAutoruIPotomNaslovu extends KompozitniKomparator {
254 public KomparatorPoAutoruIPotomNaslovu() {
255 super(new KomparatorPoAutoru(), new KomparatorPoNaslovu());
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner