From: Ivan Pribela Date: Sun, 16 Oct 2016 19:54:07 +0000 (+0200) Subject: Doterani primeri sortiranja X-Git-Url: https://svarog.pmf.uns.ac.rs/gitweb/?a=commitdiff_plain;h=2cf3bc80d3e3bb12d762916f9238b445d38129de;p=spa2-materijali.git Doterani primeri sortiranja --- diff --git a/sortiranje/knjige/Biblioteka.java b/sortiranje/knjige/Biblioteka.java index b057472..a4e543e 100644 --- a/sortiranje/knjige/Biblioteka.java +++ b/sortiranje/knjige/Biblioteka.java @@ -1,14 +1,13 @@ -/** - * Resenje zadatka sort1 sa vezbi - */ import java.util.Arrays; +import org.svetovid.Svetovid; import org.svetovid.io.SvetovidReader; import org.svetovid.io.SvetovidWriter; // Klasa koja opisuje jednu knjigu class Knjiga implements Comparable { + // Osobine jednom kreirane knjige se ne mogu menjati private final int id; private final String naslov; private final String autor; @@ -19,23 +18,7 @@ class Knjiga implements Comparable { this.autor = autor; } - public String toString() { - return id + " " + autor + ": " + naslov; - } - - public int compareTo(Knjiga that) { - // najjednostavnija verzija: knjige uredjene po "id" broju - //return this.id - that.id; - - // autor-naslov - int rez = this.autor.compareTo(that.autor); - if (rez == 0) { - rez = this.naslov.compareTo(that.naslov); - } - return rez; - } - - public String getNaslov(){ + public String getNaslov() { return naslov; } @@ -46,6 +29,32 @@ class Knjiga implements Comparable { public int getId() { return id; } + + public String toString() { + + // Tekstualna reprezentacija knjige oblika: + // 9785 J.R.R. Tolkien: The Lord of the Rings + return id + " " + autor + ": " + naslov; + + } + + public int compareTo(Knjiga that) { + + // Najjednostavnije poredjenje je po "id" broju + // return this.id - that.id; + + // No mi ovde poredimo prvo po autoru + int rezultat = this.autor.compareTo(that.autor); + + // A potom po naslovu, ako je sutor isti + if (rezultat == 0) { + rezultat = this.naslov.compareTo(that.naslov); + } + + // Vracamo rezultat poredjenja + return rezultat; + + } } // Glavni program @@ -57,7 +66,9 @@ public class Biblioteka { String fajl = Svetovid.in.readLine("Unesite ime fajla sa knjigama:"); Knjiga[] niz = ucitajKnjige(fajl); + // Dalje radimo samo ako smo uspeli da ucitamo knjige if (niz != null) { + // Stampanje ucitanog niza Svetovid.out.println(); Svetovid.out.println("Nesortirani niz:"); @@ -75,8 +86,9 @@ public class Biblioteka { // Ispis knjiga u fajl String izlazni = Svetovid.in.readLine("Unesite ime fajla za ispis:"); - snimiKnjige(niz,izlazni); + snimiKnjige(niz, izlazni); + // Prijavljujemo gresku ako nismo uspeli da ucitamo niz } else { System.err.println("Greska pri ucitavanju niza, kraj rada"); } @@ -90,8 +102,8 @@ public class Biblioteka { return null; } - // Ako mozemo, napravimo precicu 'in' da ne bi morali da - // svaki put kuvamo 'Svetovid.in(fajl)' + // Ako mozemo, napravimo precicu 'in' da ne bismo morali + // svaki put da kucamo 'Svetovid.in(fajl)' SvetovidReader in = Svetovid.in(fajl); // Koliko ima knjiga u fajlu? @@ -116,6 +128,9 @@ public class Biblioteka { } + // Zatvorimo fajl + Svetovid.closeIn(fajl); + // Vratimo ucitani niz return rez; @@ -128,27 +143,28 @@ public class Biblioteka { } public static void snimiKnjige(Knjiga[] niz, String ime) { + + // Ako ne mozemo da otvorimo fajl, vracamo se u glavni program if (!Svetovid.testOut(ime)) { - // ne mozemo da snimimo, vracamo se - System.err.println("Nemoguce snimanje u fajl"); + System.err.println("Snimanje u fajl nije moguce!"); return; } - // napravimo precicu 'out' da ne bi morali da - // svaki put pisemo 'Svetovid.out(ime)' + // Napravimo precicu 'out' da ne bismo morali + // svaki put da kucamo 'Svetovid.out(ime)' SvetovidWriter out = Svetovid.out(ime); - // pisemo broj knjiga, kao u originalu + // Upisemo ukupan broj knjiga, kao u originalnom fajlu out.println(niz.length); - // za svaku knjigu ispisujemo podatke + // Za svaku knjigu upisemo redom sve podatke for (Knjiga knjiga : niz) { out.println(knjiga.getId()); out.println(knjiga.getNaslov()); out.println(knjiga.getAutor()); } - // zatvorimo izlaz + // Zatvorimo izlaz out.close(); } diff --git a/sortiranje/knjige/Biblioteka2.java b/sortiranje/knjige/Biblioteka2.java index 0998f98..d46a897 100644 --- a/sortiranje/knjige/Biblioteka2.java +++ b/sortiranje/knjige/Biblioteka2.java @@ -1,17 +1,17 @@ -/** - * Resenje zadatka opisanog u zad-sort2, koji je prosirenje zad-sort1 - */ - -import org.svetovid.io.*; import java.util.Arrays; import java.util.Comparator; +import org.svetovid.Svetovid; +import org.svetovid.io.SvetovidReader; +import org.svetovid.io.SvetovidWriter; + // Klasa koja opisuje jednu knjigu class Knjiga implements Comparable { - public final int id; - public final String naslov; - public final String autor; + // Osobine jednom kreirane knjige se ne mogu menjati + private final int id; + private final String naslov; + private final String autor; public Knjiga(int id, String naslov, String autor) { this.id = id; @@ -19,12 +19,42 @@ class Knjiga implements Comparable { this.autor = autor; } + public String getNaslov() { + return naslov; + } + + public String getAutor() { + return autor; + } + + public int getId() { + return id; + } + public String toString() { + + // Tekstualna reprezentacija knjige oblika: + // 9785 J.R.R. Tolkien: The Lord of the Rings return id + " " + autor + ": " + naslov; + } public int compareTo(Knjiga that) { - return this.id - that.id; + + // Najjednostavnije poredjenje je po "id" broju + // return this.id - that.id; + + // No mi ovde poredimo prvo po autoru + int rezultat = this.autor.compareTo(that.autor); + + // A potom po naslovu, ako je sutor isti + if (rezultat == 0) { + rezultat = this.naslov.compareTo(that.naslov); + } + + // Vracamo rezultat poredjenja + return rezultat; + } } @@ -92,7 +122,7 @@ public class Biblioteka2 { } // Ako mozemo, napravimo precicu 'in' da ne bi morali da - // svaki put kuvamo 'Svetovid.in(imeFajla)' + // svaki put kucamo 'Svetovid.in(imeFajla)' SvetovidReader in = Svetovid.in(imeFajla); // Koliko ima knjiga u fajlu? @@ -154,10 +184,10 @@ public class Biblioteka2 { fajl.println(niz.length); // I potom podatke za svaku knjigu - for (Knjiga k : niz) { - fajl.println(k.id); - fajl.println(k.naslov); - fajl.println(k.autor); + for (Knjiga knjiga : niz) { + fajl.println(knjiga.getId()); + fajl.println(knjiga.getNaslov()); + fajl.println(knjiga.getAutor()); } // Zatvorimo fajl @@ -170,13 +200,15 @@ public class Biblioteka2 { public static void sortirajNiz(Knjiga[] niz, Comparator c) { Knjiga tmp; - for (int i = niz.length - 1; i > 0; i--) - for (int j = 0; j < i; j++) + for (int i = niz.length - 1; i > 0; i--) { + for (int j = 0; j < i; j++) { if (c.compare(niz[j], niz[i]) > 0) { tmp = niz[j]; niz[j] = niz[i]; niz[i] = tmp; } + } + } } } @@ -186,7 +218,7 @@ class KomparatorPoNaslovu implements Comparator { @Override public int compare(Knjiga knjiga1, Knjiga knjiga2) { - int rezultat = knjiga1.naslov.compareTo(knjiga2.naslov); + int rezultat = knjiga1.getNaslov().compareTo(knjiga2.getNaslov()); return rezultat; } } @@ -196,7 +228,7 @@ class KomparatorPoAutoru implements Comparator { @Override public int compare(Knjiga knjiga1, Knjiga knjiga2) { - int rezultat = knjiga1.autor.compareTo(knjiga2.autor); + int rezultat = knjiga1.getAutor().compareTo(knjiga2.getAutor()); return rezultat; } } @@ -222,7 +254,6 @@ class ObrnutiKomparator implements Comparator { @Override public int compare(Knjiga knjiga1, Knjiga knjiga2) { - return -originalni.compare(knjiga1, knjiga2); } } @@ -233,8 +264,7 @@ class KompozitniKomparator implements Comparator { private final Comparator primarni; private final Comparator sekundarni; - public KompozitniKomparator(Comparator primarni, - Comparator sekundarni) { + public KompozitniKomparator(Comparator primarni, Comparator sekundarni) { this.primarni = primarni; this.sekundarni = sekundarni; }