gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under
the git version control system
2 * Resenje zadatka opisanog u zad-sort2, koji je prosirenje zad-sort1
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
> {
13 public final String naslov
;
14 public final String autor
;
16 public Knjiga(int id
, String naslov
, String autor
) {
22 public String
toString() {
23 return id
+ " " + autor
+ ": " + naslov
;
26 public int compareTo(Knjiga that
) {
27 return this.id
- that
.id
;
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
42 Svetovid
.out
.println("Ne moze da se cita iz fajla " + imeFajla
+ ".");
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
61 sortirajNiz(niz
, new ObrnutiKomparator(new PrirodniKomparator()));
64 sortirajNiz(niz
, new KomparatorPoNaslovu());
67 sortirajNiz(niz
, new KomparatorPoAutoruIPotomNaslovu());
70 Svetovid
.out
.println("Pogresna opcija! Niz nece biti sortiran.");
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
82 Svetovid
.out
.println("Ne moze da se pise u fajl " + imeFajla
+ ".");
87 public static Knjiga
[] ucitajKnjige(String imeFajla
) {
89 // Ako ne mozemo da otvorimo fajl, ne ucitavamo knjige
90 if (!Svetovid
.testIn(imeFajla
)) {
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
];
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();
113 Knjiga knjiga
= new Knjiga(id
, naslov
, autor
);
115 // Dodamo knjigu u niz
123 // Vratimo ucitani niz
128 public static void stampajKnjige(String naslov
, Knjiga
[] niz
) {
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
)) {
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
) {
159 fajl
.println(k
.naslov
);
160 fajl
.println(k
.autor
);
164 Svetovid
.closeOut(imeFajla
);
166 // Javimo da smo uspesno sacuvali knjige
171 public static void sortirajNiz(Knjiga
[] niz
, Comparator
<Knjiga
> c
) {
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) {
184 // Komparator koji poredi knjige po naslovu
185 class KomparatorPoNaslovu
implements Comparator
<Knjiga
> {
188 public int compare(Knjiga knjiga1
, Knjiga knjiga2
) {
189 int rezultat
= knjiga1
.naslov
.compareTo(knjiga2
.naslov
);
194 // Komparator koji poredi knjige po naslovu
195 class KomparatorPoAutoru
implements Comparator
<Knjiga
> {
198 public int compare(Knjiga knjiga1
, Knjiga knjiga2
) {
199 int rezultat
= knjiga1
.autor
.compareTo(knjiga2
.autor
);
204 // Komparator koji koristi prirodni poredak, tj. samo poziva compareTo()
205 class PrirodniKomparator
implements Comparator
<Knjiga
> {
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 // koji je prosledjen u konstruktoru
215 class ObrnutiKomparator
implements Comparator
<Knjiga
> {
217 private final Comparator
<Knjiga
> originalni
;
219 public ObrnutiKomparator(Comparator
<Knjiga
> originalni
) {
220 this.originalni
= originalni
;
224 public int compare(Knjiga knjiga1
, Knjiga knjiga2
) {
226 return -originalni
.compare(knjiga1
, knjiga2
);
230 // Komparator koji prvo poredi pomocu primarnog komparatora a potom po sekundarnom
231 class KompozitniKomparator
implements Comparator
<Knjiga
> {
233 private final Comparator
<Knjiga
> primarni
;
234 private final Comparator
<Knjiga
> sekundarni
;
236 public KompozitniKomparator(Comparator
<Knjiga
> primarni
,
237 Comparator
<Knjiga
> sekundarni
) {
238 this.primarni
= primarni
;
239 this.sekundarni
= sekundarni
;
243 public int compare(Knjiga knjiga1
, Knjiga knjiga2
) {
244 int rezultat
= primarni
.compare(knjiga1
, knjiga2
);
246 rezultat
= sekundarni
.compare(knjiga1
, knjiga2
);
252 // Komparator koji poredi po autoru, a za iste autore, po naslovu
253 class KomparatorPoAutoruIPotomNaslovu
extends KompozitniKomparator
{
255 public KomparatorPoAutoruIPotomNaslovu() {
256 super(new KomparatorPoAutoru(), new KomparatorPoNaslovu());
Svarog.pmf.uns.ac.rs/gitweb
maintanance
Doni Pracner