gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Sortiranje, primer automobili sa teorijskih vezbi
[spa2-materijali.git] / sortiranje / automobili / Automobili.java
diff --git a/sortiranje/automobili/Automobili.java b/sortiranje/automobili/Automobili.java
new file mode 100644 (file)
index 0000000..3e60a39
--- /dev/null
@@ -0,0 +1,207 @@
+import java.util.Arrays;\r
+import java.util.Comparator;\r
+import java.util.Objects;\r
+\r
+import org.svetovid.io.SvetovidReader;\r
+\r
+// Tip podataka za predstavljanje automobila\r
+class Automobil implements Comparable<Automobil> {\r
+\r
+    // Osobine koje se ne mogu menjati\r
+    public final String model;\r
+    public final int godiste;\r
+    public final Motor motor;\r
+\r
+    // Osobine koje su slobodno izmenljive\r
+    public String boja;\r
+\r
+    // Osobine koje su zasticene\r
+    private int kilometraza;\r
+\r
+    public Automobil(String model, int godiste, Motor motor, String boja, int kilometraza) {\r
+        this.model = model;\r
+        this.godiste = godiste;\r
+        this.motor = motor;\r
+        this.boja = boja;\r
+        this.kilometraza = kilometraza;\r
+    }\r
+\r
+    public int getKilometraza() {\r
+        return kilometraza;\r
+    }\r
+\r
+    public void vozi(int duzina) {\r
+        this.kilometraza = this.kilometraza + duzina;\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+\r
+        // Tekstualna reprezentacija automobila oblika:\r
+        // Zastava 101 (1999) Crvena boja, presao 231000 km\r
+        return model + " (" + godiste + ") " + boja + " boja, presao " + kilometraza + " km";\r
+\r
+    }\r
+\r
+    @Override\r
+    public int compareTo(Automobil that) {\r
+\r
+        // Prvo poredimo naziv modela i ne uzimamo u obzir razlike izmedju velikih i malih slova\r
+        int rezultat = Objects.compare(this.model, that.model, String.CASE_INSENSITIVE_ORDER);\r
+\r
+        // Ako je model isti, poredimo godiste\r
+        if (rezultat == 0) {\r
+            rezultat = this.godiste - that.godiste;\r
+        }\r
+\r
+        // Vracamo rezultat poredjenja\r
+        return rezultat;\r
+\r
+    }\r
+}\r
+\r
+// Tip podataka za predstavljanje motora automobila\r
+class Motor implements Comparable<Motor> {\r
+\r
+    // Osobine koje se ne mogu menjati\r
+    public final String gorivo;\r
+    public final double snaga;\r
+\r
+    public Motor(String gorivo, double snaga) {\r
+        this.gorivo = gorivo;\r
+        this.snaga = snaga;\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+\r
+        // Tekstualna reprezentacija motora automobila oblika:\r
+        // Motor [Dizel, 52KW / 69.73 hp]\r
+        return "Motor [" + gorivo + ", " + snaga + " KW / " + snaga * 1.34102 + " hp]";\r
+\r
+    }\r
+\r
+    @Override\r
+    public int compareTo(Motor that) {\r
+\r
+        // Poredimo motore iskljucivo po snazi\r
+        return (int) Math.signum(this.snaga - that.snaga);\r
+\r
+    }\r
+}\r
+\r
+public class Automobili {\r
+\r
+    public static void main(String[] args) {\r
+\r
+        // Ucitavanje automobila\r
+        String fajl = Svetovid.in.readLine("Unesite ime fajla sa automobilima:");\r
+        Automobil[] niz = ucitajAutomobile(fajl);\r
+\r
+        // Ako nismo uspesno ucitali niz, zvrsavamo program\r
+        if (niz == null) {\r
+            Svetovid.out.println("Dati fajl nije mogao da se procita! Proverite da li postoji.");\r
+            return;\r
+        }\r
+\r
+        // Stampanje ucitanog niza\r
+        stampajNiz("Nesortirani niz:", niz);\r
+\r
+        // Sortiranje niza\r
+        sortirajNiz(niz);\r
+        stampajNiz("Sortirani niz:", niz);\r
+\r
+        // Sortiranje niza po drugom kriterijumu\r
+        sortirajNizAlt(niz);\r
+        stampajNiz("Sortirani niz po drugom kriterijumu:", niz);\r
+\r
+    }\r
+\r
+    public static Automobil[] ucitajAutomobile(String fajl) {\r
+\r
+        // Ako ne mozemo da otvorimo fajl, ne ucitavamo automobile\r
+        if (!Svetovid.testIn(fajl)) {\r
+            return null;\r
+        }\r
+\r
+        // Ako mozemo, napravimo precicu 'in' da ne bi morali da\r
+        // svaki put kucamo 'Svetovid.in(fajl)'\r
+        SvetovidReader in = Svetovid.in(fajl);\r
+\r
+        // Koliko ima automobila u fajlu?\r
+        int br = in.readInt();\r
+\r
+        // Napravimo niz odgovarajuce velicine\r
+        Automobil[] rez = new Automobil[br];\r
+\r
+        // Ucitamo automobile\r
+        for (int i = 0; i < br; i++) {\r
+\r
+            // Ucitamo podatke o automobilu\r
+            in.readLine();\r
+            String model = in.readLine();\r
+            int godiste = in.readInt();\r
+            String gorivo = in.readLine();\r
+            double snaga = in.readDouble();\r
+            String boja = in.readLine();\r
+            int kilometraza = in.readInt();\r
+\r
+            // Napravimo automobil\r
+            Motor motor = new Motor(gorivo, snaga);\r
+            Automobil automobil = new Automobil(model, godiste, motor, boja, kilometraza);\r
+\r
+            // Dodamo automobil u niz\r
+            rez[i] = automobil;\r
+\r
+        }\r
+\r
+        // Zatvorimo fajl\r
+        Svetovid.closeIn(fajl);\r
+\r
+        // Vratimo ucitani niz\r
+        return rez;\r
+\r
+    }\r
+\r
+    public static void stampajNiz(String naslov, Automobil[] niz) {\r
+        Svetovid.out.printf("%n%s%n%n", naslov);\r
+        for (Automobil a : niz) {\r
+            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());\r
+        }\r
+    }\r
+\r
+    private static void sortirajNiz(Automobil[] niz) {\r
+\r
+        // Sortiramo niz pomocu ugradjenog metoda\r
+        Arrays.sort(niz);\r
+\r
+    }\r
+\r
+    private static class GodisteIKmKomparator implements Comparator<Automobil> {\r
+\r
+        @Override\r
+        public int compare(Automobil a1, Automobil a2) {\r
+\r
+            // Poredimo automobile prvo po godistu\r
+            // Vece godiste je bolje u ovom slucaju\r
+            int rezultat = a2.godiste - a1.godiste;\r
+\r
+            // Ako su godista ista, poredimo kilometrazu\r
+            // Manje predjenih kilometara je bolje\r
+            if (rezultat == 0) {\r
+                rezultat = a1.getKilometraza() - a2.getKilometraza();\r
+            }\r
+\r
+            // Vratimo izracunati rezultat poredjenja\r
+            return rezultat;\r
+\r
+        }\r
+    }\r
+\r
+    private static void sortirajNizAlt(Automobil[] niz) {\r
+\r
+        // Sortiramo niz pomocu ugradjenog metoda\r
+        Arrays.sort(niz, new GodisteIKmKomparator());\r
+\r
+    }\r
+}\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner