From: Ivan Pribela Date: Sat, 31 Oct 2015 19:21:47 +0000 (+0100) Subject: Sortiranje, primer automobili sa teorijskih vezbi X-Git-Url: http://svarog.pmf.uns.ac.rs/gitweb/?p=spa2-materijali.git;a=commitdiff_plain;h=761170af2022d543f6c372f33d0d457978b823a9 Sortiranje, primer automobili sa teorijskih vezbi --- diff --git a/sortiranje/automobili/Automobili.java b/sortiranje/automobili/Automobili.java new file mode 100644 index 0000000..3e60a39 --- /dev/null +++ b/sortiranje/automobili/Automobili.java @@ -0,0 +1,207 @@ +import java.util.Arrays; +import java.util.Comparator; +import java.util.Objects; + +import org.svetovid.io.SvetovidReader; + +// Tip podataka za predstavljanje automobila +class Automobil implements Comparable { + + // Osobine koje se ne mogu menjati + public final String model; + public final int godiste; + public final Motor motor; + + // Osobine koje su slobodno izmenljive + public String boja; + + // Osobine koje su zasticene + private int kilometraza; + + public Automobil(String model, int godiste, Motor motor, String boja, int kilometraza) { + this.model = model; + this.godiste = godiste; + this.motor = motor; + this.boja = boja; + this.kilometraza = kilometraza; + } + + public int getKilometraza() { + return kilometraza; + } + + public void vozi(int duzina) { + this.kilometraza = this.kilometraza + duzina; + } + + @Override + public String toString() { + + // Tekstualna reprezentacija automobila oblika: + // Zastava 101 (1999) Crvena boja, presao 231000 km + return model + " (" + godiste + ") " + boja + " boja, presao " + kilometraza + " km"; + + } + + @Override + public int compareTo(Automobil that) { + + // Prvo poredimo naziv modela i ne uzimamo u obzir razlike izmedju velikih i malih slova + int rezultat = Objects.compare(this.model, that.model, String.CASE_INSENSITIVE_ORDER); + + // Ako je model isti, poredimo godiste + if (rezultat == 0) { + rezultat = this.godiste - that.godiste; + } + + // Vracamo rezultat poredjenja + return rezultat; + + } +} + +// Tip podataka za predstavljanje motora automobila +class Motor implements Comparable { + + // Osobine koje se ne mogu menjati + public final String gorivo; + public final double snaga; + + public Motor(String gorivo, double snaga) { + this.gorivo = gorivo; + this.snaga = snaga; + } + + @Override + public String toString() { + + // Tekstualna reprezentacija motora automobila oblika: + // Motor [Dizel, 52KW / 69.73 hp] + return "Motor [" + gorivo + ", " + snaga + " KW / " + snaga * 1.34102 + " hp]"; + + } + + @Override + public int compareTo(Motor that) { + + // Poredimo motore iskljucivo po snazi + return (int) Math.signum(this.snaga - that.snaga); + + } +} + +public class Automobili { + + public static void main(String[] args) { + + // Ucitavanje automobila + String fajl = Svetovid.in.readLine("Unesite ime fajla sa automobilima:"); + Automobil[] niz = ucitajAutomobile(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 + stampajNiz("Nesortirani niz:", niz); + + // Sortiranje niza + sortirajNiz(niz); + stampajNiz("Sortirani niz:", niz); + + // Sortiranje niza po drugom kriterijumu + sortirajNizAlt(niz); + stampajNiz("Sortirani niz po drugom kriterijumu:", niz); + + } + + public static Automobil[] ucitajAutomobile(String fajl) { + + // Ako ne mozemo da otvorimo fajl, ne ucitavamo automobile + if (!Svetovid.testIn(fajl)) { + return null; + } + + // Ako mozemo, napravimo precicu 'in' da ne bi morali da + // svaki put kucamo 'Svetovid.in(fajl)' + SvetovidReader in = Svetovid.in(fajl); + + // Koliko ima automobila u fajlu? + int br = in.readInt(); + + // Napravimo niz odgovarajuce velicine + Automobil[] rez = new Automobil[br]; + + // Ucitamo automobile + for (int i = 0; i < br; i++) { + + // Ucitamo podatke o automobilu + in.readLine(); + String model = in.readLine(); + int godiste = in.readInt(); + String gorivo = in.readLine(); + double snaga = in.readDouble(); + String boja = in.readLine(); + int kilometraza = in.readInt(); + + // Napravimo automobil + Motor motor = new Motor(gorivo, snaga); + Automobil automobil = new Automobil(model, godiste, motor, boja, kilometraza); + + // Dodamo automobil u niz + rez[i] = automobil; + + } + + // Zatvorimo fajl + Svetovid.closeIn(fajl); + + // Vratimo ucitani niz + return rez; + + } + + public static void stampajNiz(String naslov, Automobil[] niz) { + Svetovid.out.printf("%n%s%n%n", naslov); + for (Automobil a : niz) { + Svetovid.out.printf("%20s (%4d) %8s %8.2f KW %8s %8d km %n", a.model, a.godiste, a.motor.gorivo, a.motor.snaga, a.boja, a.getKilometraza()); + } + } + + private static void sortirajNiz(Automobil[] niz) { + + // Sortiramo niz pomocu ugradjenog metoda + Arrays.sort(niz); + + } + + private static class GodisteIKmKomparator implements Comparator { + + @Override + public int compare(Automobil a1, Automobil a2) { + + // Poredimo automobile prvo po godistu + // Vece godiste je bolje u ovom slucaju + int rezultat = a2.godiste - a1.godiste; + + // Ako su godista ista, poredimo kilometrazu + // Manje predjenih kilometara je bolje + if (rezultat == 0) { + rezultat = a1.getKilometraza() - a2.getKilometraza(); + } + + // Vratimo izracunati rezultat poredjenja + return rezultat; + + } + } + + private static void sortirajNizAlt(Automobil[] niz) { + + // Sortiramo niz pomocu ugradjenog metoda + Arrays.sort(niz, new GodisteIKmKomparator()); + + } +} diff --git a/sortiranje/automobili/automobili.txt b/sortiranje/automobili/automobili.txt new file mode 100644 index 0000000..a66230c --- /dev/null +++ b/sortiranje/automobili/automobili.txt @@ -0,0 +1,169 @@ +24 + +Opel Corsa +2007 +Benzin +59 +Crvena +57000 + +Skoda Octavia +2015 +Dizel +43 +Siva +102000 + +Skoda Superb +2015 +Dizel +52 +Bordo +105000 + +Peugeot 206 +2003 +Dizel +51 +Plava +152000 + +Opel Astra +2003 +Dizel +55 +Siva +122000 + +Citroen C4 +2011 +Dizel +82 +Plava +52000 + +Renault Twingo +2007 +Benzin +43 +Bela +120000 + +Lancia Lybra +2001 +Plin +96 +Siva +157000 + +Zastava 10 +2008 +Benzin +44 +Crna +68000 + +Ford Mondeo +1998 +Dizel +66 +Crvena +182000 + +Opel Astra +2002 +Dizel +55 +Bela +153000 + +Tesla S +2015 +Elektro +245 +Crna +0 + +Tesla X +2015 +Elektro +190 +Bela +0 + +Mazda 6 +2006 +Benzin +119 +Crvena +43000 + +Zastava 101 +2006 +Plin +40 +Crvena +179000 + +Zastava Koral +2005 +Benzin +45 +Crna +164000 + +Lancia Ypsilon +2003 +Dizel +44 +Siva +200000 + +Lancia Ypsilon +2005 +Plin +42 +Crvena +132000 + +Honda CR-V +2000 +Plin +108 +Siva +263000 + +Smart ForTwo +2005 +Dizel +52 +Zuta +50000 + +Prinz +1995 +Benzin +25 +Crvena +43000 + +Mercedes Benz 190 +1992 +Plin +90 +Siva +325000 + +BMW ActiveHybrid 5 +2014 +Hibrid +225 +Siva +23000 + +BMW Z4 +2013 +Benzin +115 +Plava +46000