From: Doni Pracner Date: Sat, 31 Oct 2015 15:52:03 +0000 (+0100) Subject: Sortiranje, raspored, resenje X-Git-Url: https://svarog.pmf.uns.ac.rs/gitweb/?a=commitdiff_plain;h=7b9424128c86f6508645a6d73954e14ca1ea3fe5;p=spa2-materijali.git Sortiranje, raspored, resenje --- diff --git a/sortiranje/raspored/Raspored.java b/sortiranje/raspored/Raspored.java new file mode 100644 index 0000000..715825c --- /dev/null +++ b/sortiranje/raspored/Raspored.java @@ -0,0 +1,257 @@ +/** + * Resenje zadatka zadatak-sort-raspored.txt + */ +import java.util.Arrays; +import java.util.Comparator; + +import org.svetovid.io.SvetovidReader; + +/** + * Klasa opisuje jednu stavku u rasporedu - odnosno jedno konkretno predavanje/vezbe, + * prestavljeno svojim danom pocetnim i krajnjim satom, salom, predmetom i godinom + * studija studenta koji treba da slusaju to predavanje. + */ +class Stavka implements Comparable { + + private String predmet, sala; + private int dan, pocetak, kraj, godina; + + public Stavka(int dan, int pocetak, int kraj, String sala, int godina, + String predmet) { + this.dan = dan; + this.pocetak = pocetak; + this.kraj = kraj; + this.sala = sala; + this.godina = godina; + this.predmet = predmet; + } + + @Override + public String toString() { + return getDan() + " " + getPocetak() + "-" + getKraj() + "\t " + getSala() + " (" + + getGodina() + " godina) " + predmet; + } + + @Override + public int compareTo(Stavka that) { + int rez = this.getDan() - that.getDan(); + + if (rez == 0) { + rez = this.getPocetak() - that.getPocetak(); + + if (rez == 0) { + rez = this.getSala().compareTo(that.getSala()); + } + } + return rez; + } + + public int getGodina() { + return godina; + } + + public int getDan() { + return dan; + } + + public int getPocetak() { + return pocetak; + } + + public String getSala() { + return sala; + } + + public int getKraj() { + return kraj; + } + + public String getPredmet() { + return predmet; + } +} + +/** + * Glavni program koji ucitava i sortira raspored + */ +public class Raspored { + + public static void main(String[] args) { + + // Ucitavanje automobila + String fajl = "r.txt";//Svetovid.in.readLine("Unesite ime fajla:"); + Stavka[] niz = ucitajStavke(fajl); + + // Ako nismo uspesno ucitali niz, zvrsavamo program + if (niz == null) { + Svetovid.out + .println("Dati fajl nije mogao da se procita! Proverite da li postoji."); + return; + } + + // Stampanje ucitanog niza + Svetovid.out.println("Originalni niz"); + stampajNiz(niz); + + Svetovid.out.println(); + Svetovid.out.println("Odaberite po cemu treba sortirati niz:"); + Svetovid.out.println("1 po imenu predmeta"); + Svetovid.out.println("2 po godini studija, danu i satima"); + Svetovid.out.println("3 po salama, danu i satu"); + Svetovid.out.println("4 po duzini predavanja"); + Svetovid.out.println("5 po danima, satima, salama"); + + int opcija = Svetovid.in.readInt(); + + if (opcija <1 || opcija >5) { + // prekidamo rad + Svetovid.out.println("nije odabrana validna opcija"); + Svetovid.out.println("kraj programa"); + return; + } + + Comparator komp = null; + switch (opcija) { + case 1: + komp = new KomparatorPoPredmetima(); + break; + case 2: + komp = new KomparatorPoGodinama(); + break; + case 3: + komp = new KomparatorPoSalama(); + break; + case 4: + komp = new KomparatorPoDuziniPredavanja(); + break; + case 5: + // ako prosledimo null komparator bice sortirano + // po "prirodnom" uredjenju, tj sa compareTo + komp = null; + break; + } + + // Sortiranje niza po drugom kriterijumu + Svetovid.out.println(); + Svetovid.out.println("Niz sortiran komparatorom"); + sortirajNiz(niz, komp); + stampajNiz(niz); + + } + + public static Stavka[] ucitajStavke(String fajl) { + + // Ako ne mozemo da otvorimo fajl, ne ucitavamo nista + if (!Svetovid.testIn(fajl)) { + return null; + } + + SvetovidReader in = Svetovid.in(fajl); + + // Koliko ima stavki u fajlu? + int br = in.readInt(); + + // Napravimo niz odgovarajuce velicine + Stavka[] rez = new Stavka[br]; + + // Ucitamo stavke + for (int i = 0; i < br; i++) { + //preskacemo prazan red + in.readLine(); + + // Ucitamo podatke + int dan = in.readInt(); + int pocetak = in.readInt(); + int kraj = in.readInt(); + String sala = in.readLine(); + int godina = in.readInt(); + String predmet = in.readLine(); + + Stavka red = new Stavka(dan, pocetak, kraj, sala, godina, predmet); + + rez[i] = red; + } + + // Zatvorimo fajl + Svetovid.closeIn(fajl); + + // Vratimo ucitani niz + return rez; + + } + + public static void stampajNiz(Stavka[] niz) { + for (Stavka a : niz) { + Svetovid.out.println(a); + } + } + + public static void sortirajNiz(Stavka[] niz) { + // Sortiramo niz pomocu ugradjenog metoda + // koristi se compareTo iz klase + Arrays.sort(niz); + } + + public static void sortirajNiz(Stavka[] niz, Comparator komparator) { + // Sortiramo niz pomocu ugradjenog metoda, a koristeci nas komparator + Arrays.sort(niz, komparator); + } + + static class KomparatorPoPredmetima implements Comparator { + + @Override + public int compare(Stavka a1, Stavka a2) { + int rezultat = a1.getPredmet().compareTo(a2.getPredmet()); + return rezultat; + } + } + + static class KomparatorPoGodinama implements Comparator { + + @Override + public int compare(Stavka a1, Stavka a2) { + int rezultat = a1.getGodina() - a2.getGodina(); + + if (rezultat == 0) { + rezultat = a1.getDan() - a2.getDan(); + + if (rezultat == 0) { + rezultat = a1.getPocetak() - a2.getPocetak(); + } + } + + // Vratimo izracunati rezultat poredjenja + return rezultat; + } + } + + static class KomparatorPoSalama implements Comparator { + + @Override + public int compare(Stavka a1, Stavka a2) { + int rezultat = a1.getSala().compareTo(a2.getSala()); + + if (rezultat == 0) { + rezultat = a1.getDan() - a2.getDan(); + + if (rezultat == 0) { + rezultat = a1.getPocetak() - a2.getPocetak(); + } + } + + // Vratimo izracunati rezultat poredjenja + return rezultat; + } + } + + static class KomparatorPoDuziniPredavanja implements Comparator { + + @Override + public int compare(Stavka a1, Stavka a2) { + int rezultat = a1.getKraj() - a1.getPocetak() - a2.getKraj() + a2.getPocetak(); + + // Vratimo izracunati rezultat poredjenja + return rezultat; + } + } +}