gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Doterani primeri sortiranja
[spa2-materijali.git] / sortiranje / knjige / Biblioteka2.java
1 import java.util.Arrays;
2 import java.util.Comparator;
4 import org.svetovid.Svetovid;
5 import org.svetovid.io.SvetovidReader;
6 import org.svetovid.io.SvetovidWriter;
8 // Klasa koja opisuje jednu knjigu
9 class Knjiga implements Comparable<Knjiga> {
11 // Osobine jednom kreirane knjige se ne mogu menjati
12 private final int id;
13 private final String naslov;
14 private 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 getNaslov() {
23 return naslov;
24 }
26 public String getAutor() {
27 return autor;
28 }
30 public int getId() {
31 return id;
32 }
34 public String toString() {
36 // Tekstualna reprezentacija knjige oblika:
37 // 9785 J.R.R. Tolkien: The Lord of the Rings
38 return id + " " + autor + ": " + naslov;
40 }
42 public int compareTo(Knjiga that) {
44 // Najjednostavnije poredjenje je po "id" broju
45 // return this.id - that.id;
47 // No mi ovde poredimo prvo po autoru
48 int rezultat = this.autor.compareTo(that.autor);
50 // A potom po naslovu, ako je sutor isti
51 if (rezultat == 0) {
52 rezultat = this.naslov.compareTo(that.naslov);
53 }
55 // Vracamo rezultat poredjenja
56 return rezultat;
58 }
59 }
61 // Glavni program
62 public class Biblioteka2 {
64 public static void main(String[] arguments) {
66 // Ucitavamo knjige iz fajla
67 String imeFajla = Svetovid.in.readLine("Unesite ime fajla sa knjigama:");
68 Knjiga[] niz = ucitajKnjige(imeFajla);
70 // Ako nismo ucitali knjige, zavrsavamo program sa return
71 if (niz == null) {
72 Svetovid.out.println("Ne moze da se cita iz fajla " + imeFajla + ".");
73 return;
74 }
76 // Pitamo korisnika za kriterijum sortiranja
77 Svetovid.out.println("Opcija 1: standardan sort bez komparatora");
78 Svetovid.out.println("Opcija 2: sort sa opadajucim id knjige");
79 Svetovid.out.println("Opcija 3: sort po naslovu");
80 Svetovid.out.println("Opcija 4: sort po autoru, a zatim po naslovu");
81 Svetovid.out.println("Za ostale opcije niz nece biti sortiran");
82 Svetovid.out.print("Unesite opciju 1-4:");
83 int opcija = Svetovid.in.readInt();
85 // Sortiramo po odabranom kriterijumu
86 switch (opcija) {
87 case 1:
88 Arrays.sort(niz);
89 break;
90 case 2:
91 sortirajNiz(niz, new ObrnutiKomparator(new PrirodniKomparator()));
92 break;
93 case 3:
94 sortirajNiz(niz, new KomparatorPoNaslovu());
95 break;
96 case 4:
97 sortirajNiz(niz, new KomparatorPoAutoruIPotomNaslovu());
98 break;
99 default:
100 Svetovid.out.println("Pogresna opcija! Niz nece biti sortiran.");
103 // Stampamo niz
104 stampajKnjige("Niz knjiga", niz);
106 // Sacuvamo (sortirani) niz u novi fajl
107 imeFajla = Svetovid.in.readLine("Unesite ime fajla za snimanje: ");
108 boolean sacuvano = sacuvajKnjige(imeFajla, niz);
110 // Ako nismo sacuvali knjige, prijavimo to korisniku
111 if (!sacuvano) {
112 Svetovid.out.println("Ne moze da se pise u fajl " + imeFajla + ".");
117 public static Knjiga[] ucitajKnjige(String imeFajla) {
119 // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige
120 if (!Svetovid.testIn(imeFajla)) {
121 return null;
124 // Ako mozemo, napravimo precicu 'in' da ne bi morali da
125 // svaki put kucamo 'Svetovid.in(imeFajla)'
126 SvetovidReader in = Svetovid.in(imeFajla);
128 // Koliko ima knjiga u fajlu?
129 int br = in.readInt();
131 // Napravimo niz odgovarajuce velicine
132 Knjiga[] rez = new Knjiga[br];
134 // Ucitamo knjige
135 for (int i = 0; i < br; i++) {
137 // Ucitamo podatke o knjizi
138 int id = in.readInt();
139 String naslov = in.readLine();
140 String autor = in.readLine();
142 // Napravimo knjigu
143 Knjiga knjiga = new Knjiga(id, naslov, autor);
145 // Dodamo knjigu u niz
146 rez[i] = knjiga;
150 // Zatvorimo fajl
151 in.close();
153 // Vratimo ucitani niz
154 return rez;
158 public static void stampajKnjige(String naslov, Knjiga[] niz) {
160 // Odstampamo naslov
161 Svetovid.out.println();
162 Svetovid.out.println(naslov);
163 Svetovid.out.println();
165 // I potom sve knjige redom
166 for (Knjiga knjiga : niz) {
167 Svetovid.out.println(knjiga);
172 public static boolean sacuvajKnjige(String imeFajla, Knjiga[] niz) {
174 // Ako ne mozemo da otvorimo fajl, ne upisujemo knjige
175 if (!Svetovid.testOut(imeFajla)) {
176 return false;
179 // Ako mozemo, napravimo precicu 'out' da ne bi morali da
180 // svaki put kucamo 'Svetovid.out(imeFajla)'
181 SvetovidWriter fajl = Svetovid.out(imeFajla);
183 // Upisemo ukupan broj knjiga
184 fajl.println(niz.length);
186 // I potom podatke za svaku knjigu
187 for (Knjiga knjiga : niz) {
188 fajl.println(knjiga.getId());
189 fajl.println(knjiga.getNaslov());
190 fajl.println(knjiga.getAutor());
193 // Zatvorimo fajl
194 Svetovid.closeOut(imeFajla);
196 // Javimo da smo uspesno sacuvali knjige
197 return true;
201 public static void sortirajNiz(Knjiga[] niz, Comparator<Knjiga> c) {
202 Knjiga tmp;
203 for (int i = niz.length - 1; i > 0; i--) {
204 for (int j = 0; j < i; j++) {
205 if (c.compare(niz[j], niz[i]) > 0) {
206 tmp = niz[j];
207 niz[j] = niz[i];
208 niz[i] = tmp;
216 // Komparator koji poredi knjige po naslovu
217 class KomparatorPoNaslovu implements Comparator<Knjiga> {
219 @Override
220 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
221 int rezultat = knjiga1.getNaslov().compareTo(knjiga2.getNaslov());
222 return rezultat;
226 // Komparator koji poredi knjige po naslovu
227 class KomparatorPoAutoru implements Comparator<Knjiga> {
229 @Override
230 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
231 int rezultat = knjiga1.getAutor().compareTo(knjiga2.getAutor());
232 return rezultat;
236 // Komparator koji koristi prirodni poredak, tj. samo poziva compareTo()
237 class PrirodniKomparator implements Comparator<Knjiga> {
239 @Override
240 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
241 return knjiga1.compareTo(knjiga2);
245 // Komparator koji daje obrnuti poredak u odnosu na originalni komparator
246 // koji je prosledjen u konstruktoru
247 class ObrnutiKomparator implements Comparator<Knjiga> {
249 private final Comparator<Knjiga> originalni;
251 public ObrnutiKomparator(Comparator<Knjiga> originalni) {
252 this.originalni = originalni;
255 @Override
256 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
257 return -originalni.compare(knjiga1, knjiga2);
261 // Komparator koji prvo poredi pomocu primarnog komparatora a potom po sekundarnom
262 class KompozitniKomparator implements Comparator<Knjiga> {
264 private final Comparator<Knjiga> primarni;
265 private final Comparator<Knjiga> sekundarni;
267 public KompozitniKomparator(Comparator<Knjiga> primarni, Comparator<Knjiga> sekundarni) {
268 this.primarni = primarni;
269 this.sekundarni = sekundarni;
272 @Override
273 public int compare(Knjiga knjiga1, Knjiga knjiga2) {
274 int rezultat = primarni.compare(knjiga1, knjiga2);
275 if (rezultat == 0) {
276 rezultat = sekundarni.compare(knjiga1, knjiga2);
278 return rezultat;
282 // Komparator koji poredi po autoru, a za iste autore, po naslovu
283 class KomparatorPoAutoruIPotomNaslovu extends KompozitniKomparator {
285 public KomparatorPoAutoruIPotomNaslovu() {
286 super(new KomparatorPoAutoru(), new KomparatorPoNaslovu());
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner