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
1 import java.util.Arrays;
2 import java.util.Comparator;
3 import java.util.Objects;
5 import org.svetovid.io.SvetovidReader;
7 // Tip podataka za predstavljanje automobila
8 class Automobil implements Comparable<Automobil> {
10 // Osobine koje se ne mogu menjati
11 public final String model;
12 public final int godiste;
13 public final Motor motor;
15 // Osobine koje su slobodno izmenljive
16 public String boja;
18 // Osobine koje su zasticene
19 private int kilometraza;
21 public Automobil(String model, int godiste, Motor motor, String boja, int kilometraza) {
22 this.model = model;
23 this.godiste = godiste;
24 this.motor = motor;
25 this.boja = boja;
26 this.kilometraza = kilometraza;
27 }
29 public int getKilometraza() {
30 return kilometraza;
31 }
33 public void vozi(int duzina) {
34 this.kilometraza = this.kilometraza + duzina;
35 }
37 @Override
38 public String toString() {
40 // Tekstualna reprezentacija automobila oblika:
41 // Zastava 101 (1999) Crvena boja, presao 231000 km
42 return model + " (" + godiste + ") " + boja + " boja, presao " + kilometraza + " km";
44 }
46 @Override
47 public int compareTo(Automobil that) {
49 // Prvo poredimo naziv modela i ne uzimamo u obzir razlike izmedju velikih i malih slova
50 int rezultat = Objects.compare(this.model, that.model, String.CASE_INSENSITIVE_ORDER);
52 // Ako je model isti, poredimo godiste
53 if (rezultat == 0) {
54 rezultat = this.godiste - that.godiste;
55 }
57 // Vracamo rezultat poredjenja
58 return rezultat;
60 }
61 }
63 // Tip podataka za predstavljanje motora automobila
64 class Motor implements Comparable<Motor> {
66 // Osobine koje se ne mogu menjati
67 public final String gorivo;
68 public final double snaga;
70 public Motor(String gorivo, double snaga) {
71 this.gorivo = gorivo;
72 this.snaga = snaga;
73 }
75 @Override
76 public String toString() {
78 // Tekstualna reprezentacija motora automobila oblika:
79 // Motor [Dizel, 52KW / 69.73 hp]
80 return "Motor [" + gorivo + ", " + snaga + " KW / " + snaga * 1.34102 + " hp]";
82 }
84 @Override
85 public int compareTo(Motor that) {
87 // Poredimo motore iskljucivo po snazi
88 return (int) Math.signum(this.snaga - that.snaga);
90 }
91 }
93 public class Automobili {
95 public static void main(String[] args) {
97 // Ucitavanje automobila
98 String fajl = Svetovid.in.readLine("Unesite ime fajla sa automobilima:");
99 Automobil[] niz = ucitajAutomobile(fajl);
101 // Ako nismo uspesno ucitali niz, zvrsavamo program
102 if (niz == null) {
103 Svetovid.out.println("Dati fajl nije mogao da se procita! Proverite da li postoji.");
104 return;
107 // Stampanje ucitanog niza
108 stampajNiz("Nesortirani niz:", niz);
110 // Sortiranje niza
111 sortirajNiz(niz);
112 stampajNiz("Sortirani niz:", niz);
114 // Sortiranje niza po drugom kriterijumu
115 sortirajNizAlt(niz);
116 stampajNiz("Sortirani niz po drugom kriterijumu:", niz);
120 public static Automobil[] ucitajAutomobile(String fajl) {
122 // Ako ne mozemo da otvorimo fajl, ne ucitavamo automobile
123 if (!Svetovid.testIn(fajl)) {
124 return null;
127 // Ako mozemo, napravimo precicu 'in' da ne bi morali da
128 // svaki put kucamo 'Svetovid.in(fajl)'
129 SvetovidReader in = Svetovid.in(fajl);
131 // Koliko ima automobila u fajlu?
132 int br = in.readInt();
134 // Napravimo niz odgovarajuce velicine
135 Automobil[] rez = new Automobil[br];
137 // Ucitamo automobile
138 for (int i = 0; i < br; i++) {
140 // Ucitamo podatke o automobilu
141 in.readLine();
142 String model = in.readLine();
143 int godiste = in.readInt();
144 String gorivo = in.readLine();
145 double snaga = in.readDouble();
146 String boja = in.readLine();
147 int kilometraza = in.readInt();
149 // Napravimo automobil
150 Motor motor = new Motor(gorivo, snaga);
151 Automobil automobil = new Automobil(model, godiste, motor, boja, kilometraza);
153 // Dodamo automobil u niz
154 rez[i] = automobil;
158 // Zatvorimo fajl
159 Svetovid.closeIn(fajl);
161 // Vratimo ucitani niz
162 return rez;
166 public static void stampajNiz(String naslov, Automobil[] niz) {
167 Svetovid.out.printf("%n%s%n%n", naslov);
168 for (Automobil a : niz) {
169 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());
173 private static void sortirajNiz(Automobil[] niz) {
175 // Sortiramo niz pomocu ugradjenog metoda
176 Arrays.sort(niz);
180 private static class GodisteIKmKomparator implements Comparator<Automobil> {
182 @Override
183 public int compare(Automobil a1, Automobil a2) {
185 // Poredimo automobile prvo po godistu
186 // Vece godiste je bolje u ovom slucaju
187 int rezultat = a2.godiste - a1.godiste;
189 // Ako su godista ista, poredimo kilometrazu
190 // Manje predjenih kilometara je bolje
191 if (rezultat == 0) {
192 rezultat = a1.getKilometraza() - a2.getKilometraza();
195 // Vratimo izracunati rezultat poredjenja
196 return rezultat;
201 private static void sortirajNizAlt(Automobil[] niz) {
203 // Sortiramo niz pomocu ugradjenog metoda
204 Arrays.sort(niz, new GodisteIKmKomparator());
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner