gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Resenje zad-sort2
[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
38 .readLine("Unesite ime fajla sa knjigama:");
39 Knjiga[] niz = ucitajKnjige(imeFajla);
41 // Ako nismo ucitali knjige, zavrsavamo program sa return
42 if (niz == null) {
43 Svetovid.out.println("Ne moze da se cita iz fajla " + imeFajla
44 + ".");
45 return;
46 }
48 // Pitamo korisnika za kriterijum sortiranja
49 Svetovid.out.println("Opcija 1: standardan sort bez komparatora");
50 Svetovid.out.println("Opcija 2: sort sa opadajucim id knjige");
51 Svetovid.out.println("Opcija 3: sort po naslovu");
52 Svetovid.out.println("Opcija 4: sort po autoru, a zatim po naslovu");
53 Svetovid.out.println("Za ostale opcije niz nece biti sortiran");
54 Svetovid.out.print("Unesite opciju 1-4:");
55 int opcija = Svetovid.in.readInt();
57 // Sortiramo po odabranom kriterijumu
58 switch (opcija) {
59 case 1:
60 Arrays.sort(niz);
61 break;
62 case 2:
63 sortirajNiz(niz, new ObrnutiKomparator(new PrirodniKomparator()));
64 break;
65 case 3:
66 sortirajNiz(niz, new KomparatorPoNaslovu());
67 break;
68 case 4:
69 sortirajNiz(niz, new KomparatorPoAutoruIPotomNaslovu());
70 break;
71 default:
72 Svetovid.out.println("Pogresna opcija! Niz nece biti sortiran.");
73 }
75 // Stampamo niz
76 stampajKnjige("Niz knjiga", niz);
78 // Sacuvamo (sortirani) niz u novi fajl
79 imeFajla = Svetovid.in.readLine("Unesite ime fajla za snimanje: ");
80 boolean sacuvano = sacuvajKnjige(imeFajla, niz);
82 // Ako nismo sacuvali knjige, prijavimo to korisniku
83 if (!sacuvano) {
84 Svetovid.out.println("Ne moze da se pise u fajl " + imeFajla + ".");
85 }
87 }
89 public static Knjiga[] ucitajKnjige(String imeFajla) {
91 // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige
92 if (!Svetovid.testIn(imeFajla)) {
93 return null;
94 }
96 // Ako mozemo, napravimo precicu 'in' da ne bi morali da
97 // svaki put kuvamo 'Svetovid.in(imeFajla)'
98 SvetovidReader in = Svetovid.in(imeFajla);
100 // Koliko ima knjiga u fajlu?
101 int br = in.readInt();
103 // Napravimo niz odgovarajuce velicine
104 Knjiga[] rez = new Knjiga[br];
106 // Ucitamo knjige
107 for (int i = 0; i < br; i++) {
109 // Ucitamo podatke o knjizi
110 int id = in.readInt();
111 String naslov = in.readLine();
112 String autor = in.readLine();
114 // Napravimo knjigu
115 Knjiga knjiga = new Knjiga(id, naslov, autor);
117 // Dodamo knjigu u niz
118 rez[i] = knjiga;
122 // Zatvorimo fajl
123 in.close();
125 // Vratimo ucitani niz
126 return rez;
130 public static void stampajKnjige(String naslov, Knjiga[] niz) {
132 // Odstampamo naslov
133 Svetovid.out.println();
134 Svetovid.out.println(naslov);
135 Svetovid.out.println();
137 // I potom sve knjige redom
138 for (Knjiga knjiga : niz) {
139 Svetovid.out.println(knjiga);
144 public static boolean sacuvajKnjige(String imeFajla, Knjiga[] niz) {
146 // Ako ne mozemo da otvorimo fajl, ne upisujemo knjige
147 if (!Svetovid.testOut(imeFajla)) {
148 return false;
151 // Ako mozemo, napravimo precicu 'out' da ne bi morali da
152 // svaki put kuvamo 'Svetovid.out(imeFajla)'
153 SvetovidWriter fajl = Svetovid.out(imeFajla);
155 // Upisemo ukupan broj knjiga
156 fajl.println(niz.length);
158 // I potom podatke za svaku knjigu
159 for (Knjiga k : niz) {
160 fajl.println(k.id);
161 fajl.println(k.naslov);
162 fajl.println(k.autor);
165 // Zatvorimo fajl
166 Svetovid.closeOut(imeFajla);
168 // Javimo da smo uspesno sacuvali knjige
169 return true;
173 public static void sortirajNiz(Knjiga[] niz, Comparator<Knjiga> c) {
174 Knjiga tmp;
175 for (int i = niz.length - 1; i > 0; i--)
176 for (int j = 0; j < i; j++)
177 if (c.compare(niz[j], niz[i]) > 0) {
178 tmp = niz[j];
179 niz[j] = niz[i];
180 niz[i] = tmp;
186 // Komparator koji poredi knjige po naslovu
187 class KomparatorPoNaslovu implements Comparator<Knjiga> {
189 @Override
190 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
191 int rezultat = knjiga1.naslov.compareTo(knjiga2.naslov);
192 return rezultat;
196 // Komparator koji poredi knjige po naslovu
197 class KomparatorPoAutoru implements Comparator<Knjiga> {
199 @Override
200 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
201 int rezultat = knjiga1.autor.compareTo(knjiga2.autor);
202 return rezultat;
206 // Komparator koji koristi prirodni poredak, tj. samo poziva compareTo()
207 class PrirodniKomparator implements Comparator<Knjiga> {
209 @Override
210 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
211 return knjiga1.compareTo(knjiga2);
215 // Komparator koji daje obrnuti poredak u odnosu na originalni komparator
216 // koji mu je prosledjen u konstruktoru
217 class ObrnutiKomparator implements Comparator<Knjiga> {
219 private final Comparator<Knjiga> originalni;
221 public ObrnutiKomparator(Comparator<Knjiga> originalni) {
222 this.originalni = originalni;
225 @Override
226 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
228 return -originalni.compare(knjiga1, knjiga2);
232 // Komparator koji prvo poredi pomocu primarnog komparatora a potom po
233 // sekundarnom
234 class KompozitniKomparator implements Comparator<Knjiga> {
236 private final Comparator<Knjiga> primarni;
237 private final Comparator<Knjiga> sekundarni;
239 public KompozitniKomparator(Comparator<Knjiga> primarni,
240 Comparator<Knjiga> sekundarni) {
241 this.primarni = primarni;
242 this.sekundarni = sekundarni;
245 @Override
246 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
247 int rezultat = primarni.compare(knjiga1, knjiga2);
248 if (rezultat == 0) {
249 rezultat = sekundarni.compare(knjiga1, knjiga2);
251 return rezultat;
255 // Komparator koji poredi po autoru, a za iste autore, po naslovu
256 class KomparatorPoAutoruIPotomNaslovu extends KompozitniKomparator {
258 public KomparatorPoAutoruIPotomNaslovu() {
259 super(new KomparatorPoAutoru(), new KomparatorPoNaslovu());
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner