gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Stabla, primer konkretnog stabla osoba
[spa2-materijali.git] / Stabla / konkretnoStablo / StabloOsobaProgram.java
2 import java.util.ArrayList;
3 import java.util.List;
4 import java.util.NoSuchElementException;
5 import java.util.Objects;
7 import org.svetovid.Svetovid;
9 // Konkretno stablo koje sadrzi ocene
10 class StabloOsoba {
12 // Tip koji opisuje jedan cvor u stablu
13 protected static class Cvor {
15 // Sadrzaj cvora
16 public final Osoba osoba;
18 // Levo i desno podstablo
19 public final Cvor levo;
20 public final Cvor desno;
22 // Jedini konstruktor
23 public Cvor(Osoba osoba, Cvor levo, Cvor desno) {
24 this.osoba = osoba;
25 this.levo = levo;
26 this.desno = desno;
27 }
28 }
30 // Stablo ima referencu na korenski cvor
31 protected final Cvor koren;
33 // Kreiramo prazno stablo
34 public StabloOsoba() {
35 koren = null;
36 }
38 // Kreiramo stablo sa jednom osobom u korenu
39 // i praznim evim i desnim podstablom
40 public StabloOsoba(Osoba osoba) {
41 koren = new Cvor(osoba, null, null);
42 }
44 // Specijalan konstruktor koji koriste neki metodi ove klase
45 protected StabloOsoba(Cvor koren) {
46 this.koren = koren;
47 }
49 // Vraca osobu koja je direktor cele firme
50 public Osoba getDirektor() {
51 if (koren == null) { // Stablo je prazno
52 throw new NoSuchElementException();
53 }
54 return koren.osoba;
55 }
57 // Vraca ukupan broj osoba u stablu
58 public int brojOsoba() {
59 return brojOsoba(koren);
60 }
62 protected static int brojOsoba(Cvor cvor) {
63 if (cvor == null) {
64 return 0;
65 }
66 int broj = 1;
67 broj = broj + brojOsoba(cvor.levo);
68 broj = broj + brojOsoba(cvor.desno);
69 return broj;
70 }
72 // Stampa sve osobe
73 public void stampajSveOsobe() {
74 stampajSveOsobe(koren);
75 }
77 protected static void stampajSveOsobe(Cvor cvor) {
78 if (cvor == null) {
79 return;
80 }
81 stampajSveOsobe(cvor.levo);
82 Svetovid.out.println(cvor.osoba);
83 stampajSveOsobe(cvor.desno);
84 }
86 // Vraca listu svih osoba
87 public List<Osoba> sveOsobe() {
88 List<Osoba> osobe = new ArrayList<>();
89 sveOsobe(koren, osobe);
90 return osobe;
91 }
93 protected static void sveOsobe(Cvor cvor, List<Osoba> lista) {
94 if (cvor == null) {
95 return;
96 }
97 sveOsobe(cvor.levo, lista);
98 lista.add(cvor.osoba);
99 sveOsobe(cvor.desno, lista);
102 // Pronalazi datu osobu i vraca stablo sa korenom u njoj
103 public StabloOsoba pronadji(Osoba osoba) {
104 Cvor cvor = pronadji(koren, osoba);
105 if (cvor == null) {
106 return null;
108 return new StabloOsoba(cvor);
111 protected static Cvor pronadji(Cvor cvor, Osoba osoba) {
112 if (cvor == null) {
113 return null;
115 if (Objects.equals(cvor.osoba, osoba)) {
116 return cvor;
118 Cvor nadjenLevo = pronadji(cvor.levo, osoba);
119 if (nadjenLevo != null) {
120 return nadjenLevo;
122 Cvor nadjenDesno = pronadji(cvor.desno, osoba);
123 if (nadjenDesno != null) {
124 return nadjenDesno;
126 return null;
129 // Pronalazi sefa date osobe
130 public Osoba sefOd(Osoba podredjeni) {
131 Cvor cvor = sefOd(koren, null, podredjeni);
132 if (cvor == null) {
133 return null;
135 return cvor.osoba;
138 protected static Cvor sefOd(Cvor tekuci, Cvor roditelj, Osoba podredjeni) {
139 if (tekuci == null) {
140 return null;
142 if (Objects.equals(tekuci.osoba, podredjeni)) {
143 return roditelj;
145 Cvor roditeljLevo = sefOd(tekuci.levo, tekuci, podredjeni);
146 if (roditeljLevo != null) {
147 return roditeljLevo;
149 Cvor roditeljDesno = sefOd(tekuci.desno, tekuci, podredjeni);
150 if (roditeljDesno != null) {
151 return roditeljDesno;
153 return null;
156 // Vraca listu svih osoba sa platom manjom od granice
157 public List<Osoba> sviSaPlatomIspod(int granica) {
158 List<Osoba> osobe = new ArrayList<>();
159 sviSaPlatomIspod(koren, osobe, granica);
160 return osobe;
163 protected static void sviSaPlatomIspod(Cvor cvor, List<Osoba> lista, int granica) {
164 if (cvor == null) {
165 return;
167 if (cvor.osoba.getPlata() < granica) {
168 lista.add(cvor.osoba);
170 sviSaPlatomIspod(cvor.levo, lista, granica);
171 sviSaPlatomIspod(cvor.desno, lista, granica);
174 // Vraca listu svih osoba podredjenih datoj
175 public List<Osoba> sviPodredjeni(Osoba sef) {
176 List<Osoba> osobe = new ArrayList<>();
177 Cvor cvor = pronadji(koren, sef);
178 if (cvor != null) {
179 sveOsobe(cvor, osobe);
181 return osobe;
184 // Ispisuje sve puteve u stablu od korena do svih listova
185 public void odDirektoraDoSpremacice() {
186 List<Osoba> put = new ArrayList<>();
187 odDirektoraDoSpremacice(koren, put);
190 protected static void odDirektoraDoSpremacice(Cvor cvor, List<Osoba> put) {
191 if (cvor == null) {
192 return;
194 put.add(cvor.osoba);
195 if ((cvor.levo == null) && (cvor.desno == null)) {
196 Svetovid.out.println(put);
198 odDirektoraDoSpremacice(cvor.levo, put);
199 odDirektoraDoSpremacice(cvor.desno, put);
200 put.remove(put.size() - 1);
204 // Glavna klasa
205 public class StabloOsobaProgram {
207 // Glavni program
208 public static void main(String[] args) {
210 // Napravimo pomocni objekat za ucitavanje i ispisivanje
211 TreeIO<StabloOsoba> io = new TreeIO<>(StabloOsoba.class);
213 // Procitamo stablo iz fajla
214 StabloOsoba stablo = io.read(Svetovid.in("Osobe.txt"));
216 // Ispisemo ucitano stablo
217 io.print(Svetovid.out, stablo);
219 // Osoba koju cemo traziti u stablu
220 Osoba osobaX = new Osoba("Nikola", "Nikolic-Nikolic", 0);
222 // Broj osoba
223 int br = stablo.brojOsoba();
224 Svetovid.out.println();
225 Svetovid.out.println("Broj osoba u firmi: " + br);
227 // Stampanje svih osoba
228 Svetovid.out.println();
229 Svetovid.out.println("Te osobe su: ");
230 stablo.stampajSveOsobe();
232 // Preuzimanje osoba u listu
233 List<Osoba> sveOsobe = stablo.sveOsobe();
234 Svetovid.out.println();
235 Svetovid.out.println("Ili kako lista: " + sveOsobe);
237 // Podstablo sa Nikolom kao korenom
238 StabloOsoba podstablo = stablo.pronadji(osobaX);
239 Svetovid.out.println();
240 Svetovid.out.println(osobaX + " i podredjeni:");
241 io.print(Svetovid.out, podstablo);
243 // Ko je Nikolin sef
244 Svetovid.out.println();
245 Osoba sef = stablo.sefOd(osobaX);
246 if (sef != null) {
247 Svetovid.out.println("Sef od " + osobaX + " je " + sef);
248 } else {
249 Svetovid.out.println(osobaX + " je direktor");
252 // Plate
253 int plata = podstablo.getDirektor().getPlata();
254 Svetovid.out.println();
255 Svetovid.out.println("Plata od " + podstablo.getDirektor() + " je " + plata + "din");
256 List<Osoba> sviSaPlatomIspod = stablo.sviSaPlatomIspod(plata);
257 Svetovid.out.println();
258 Svetovid.out.println("Svi koji imaju platu manju od " + podstablo.getDirektor() + " su: " + sviSaPlatomIspod);
260 // Podredjeni
261 List<Osoba> sviPodredjeni = stablo.sviPodredjeni(osobaX);
262 Svetovid.out.println();
263 Svetovid.out.println("Svi koji podredjeni od " + podstablo.getDirektor() + " su: " + sviPodredjeni);
265 // Struktura firme od diroktora do svakog zaposlenog koji nema podredjene
266 Svetovid.out.println();
267 Svetovid.out.println("Hijerarhija sefova za svakog zaposlenog koji nema svoje podredjene:");
268 stablo.odDirektoraDoSpremacice();
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner