gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control systemdiff --git a/Stabla/konkretnoStablo/StabloOsobaProgram.java b/Stabla/konkretnoStablo/StabloOsobaProgram.java
--- /dev/null
@@ -0,0 +1,271 @@
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.NoSuchElementException;\r
+import java.util.Objects;\r
+\r
+import org.svetovid.Svetovid;\r
+\r
+// Konkretno stablo koje sadrzi ocene\r
+class StabloOsoba {\r
+\r
+ // Tip koji opisuje jedan cvor u stablu\r
+ protected static class Cvor {\r
+\r
+ // Sadrzaj cvora\r
+ public final Osoba osoba;\r
+\r
+ // Levo i desno podstablo\r
+ public final Cvor levo;\r
+ public final Cvor desno;\r
+\r
+ // Jedini konstruktor\r
+ public Cvor(Osoba osoba, Cvor levo, Cvor desno) {\r
+ this.osoba = osoba;\r
+ this.levo = levo;\r
+ this.desno = desno;\r
+ }\r
+ }\r
+\r
+ // Stablo ima referencu na korenski cvor\r
+ protected final Cvor koren;\r
+\r
+ // Kreiramo prazno stablo\r
+ public StabloOsoba() {\r
+ koren = null;\r
+ }\r
+\r
+ // Kreiramo stablo sa jednom osobom u korenu\r
+ // i praznim evim i desnim podstablom\r
+ public StabloOsoba(Osoba osoba) {\r
+ koren = new Cvor(osoba, null, null);\r
+ }\r
+\r
+ // Specijalan konstruktor koji koriste neki metodi ove klase\r
+ protected StabloOsoba(Cvor koren) {\r
+ this.koren = koren;\r
+ }\r
+\r
+ // Vraca osobu koja je direktor cele firme\r
+ public Osoba getDirektor() {\r
+ if (koren == null) { // Stablo je prazno\r
+ throw new NoSuchElementException();\r
+ }\r
+ return koren.osoba;\r
+ }\r
+\r
+ // Vraca ukupan broj osoba u stablu\r
+ public int brojOsoba() {\r
+ return brojOsoba(koren);\r
+ }\r
+\r
+ protected static int brojOsoba(Cvor cvor) {\r
+ if (cvor == null) {\r
+ return 0;\r
+ }\r
+ int broj = 1;\r
+ broj = broj + brojOsoba(cvor.levo);\r
+ broj = broj + brojOsoba(cvor.desno);\r
+ return broj;\r
+ }\r
+\r
+ // Stampa sve osobe\r
+ public void stampajSveOsobe() {\r
+ stampajSveOsobe(koren);\r
+ }\r
+\r
+ protected static void stampajSveOsobe(Cvor cvor) {\r
+ if (cvor == null) {\r
+ return;\r
+ }\r
+ stampajSveOsobe(cvor.levo);\r
+ Svetovid.out.println(cvor.osoba);\r
+ stampajSveOsobe(cvor.desno);\r
+ }\r
+\r
+ // Vraca listu svih osoba\r
+ public List<Osoba> sveOsobe() {\r
+ List<Osoba> osobe = new ArrayList<>();\r
+ sveOsobe(koren, osobe);\r
+ return osobe;\r
+ }\r
+\r
+ protected static void sveOsobe(Cvor cvor, List<Osoba> lista) {\r
+ if (cvor == null) {\r
+ return;\r
+ }\r
+ sveOsobe(cvor.levo, lista);\r
+ lista.add(cvor.osoba);\r
+ sveOsobe(cvor.desno, lista);\r
+ }\r
+\r
+ // Pronalazi datu osobu i vraca stablo sa korenom u njoj\r
+ public StabloOsoba pronadji(Osoba osoba) {\r
+ Cvor cvor = pronadji(koren, osoba);\r
+ if (cvor == null) {\r
+ return null;\r
+ }\r
+ return new StabloOsoba(cvor);\r
+ }\r
+\r
+ protected static Cvor pronadji(Cvor cvor, Osoba osoba) {\r
+ if (cvor == null) {\r
+ return null;\r
+ }\r
+ if (Objects.equals(cvor.osoba, osoba)) {\r
+ return cvor;\r
+ }\r
+ Cvor nadjenLevo = pronadji(cvor.levo, osoba);\r
+ if (nadjenLevo != null) {\r
+ return nadjenLevo;\r
+ }\r
+ Cvor nadjenDesno = pronadji(cvor.desno, osoba);\r
+ if (nadjenDesno != null) {\r
+ return nadjenDesno;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ // Pronalazi sefa date osobe\r
+ public Osoba sefOd(Osoba podredjeni) {\r
+ Cvor cvor = sefOd(koren, null, podredjeni);\r
+ if (cvor == null) {\r
+ return null;\r
+ }\r
+ return cvor.osoba;\r
+ }\r
+ \r
+ protected static Cvor sefOd(Cvor tekuci, Cvor roditelj, Osoba podredjeni) {\r
+ if (tekuci == null) {\r
+ return null;\r
+ }\r
+ if (Objects.equals(tekuci.osoba, podredjeni)) {\r
+ return roditelj;\r
+ }\r
+ Cvor roditeljLevo = sefOd(tekuci.levo, tekuci, podredjeni);\r
+ if (roditeljLevo != null) {\r
+ return roditeljLevo;\r
+ }\r
+ Cvor roditeljDesno = sefOd(tekuci.desno, tekuci, podredjeni);\r
+ if (roditeljDesno != null) {\r
+ return roditeljDesno;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ // Vraca listu svih osoba sa platom manjom od granice\r
+ public List<Osoba> sviSaPlatomIspod(int granica) {\r
+ List<Osoba> osobe = new ArrayList<>();\r
+ sviSaPlatomIspod(koren, osobe, granica);\r
+ return osobe;\r
+ }\r
+\r
+ protected static void sviSaPlatomIspod(Cvor cvor, List<Osoba> lista, int granica) {\r
+ if (cvor == null) {\r
+ return;\r
+ }\r
+ if (cvor.osoba.getPlata() < granica) {\r
+ lista.add(cvor.osoba);\r
+ }\r
+ sviSaPlatomIspod(cvor.levo, lista, granica);\r
+ sviSaPlatomIspod(cvor.desno, lista, granica);\r
+ }\r
+\r
+ // Vraca listu svih osoba podredjenih datoj\r
+ public List<Osoba> sviPodredjeni(Osoba sef) {\r
+ List<Osoba> osobe = new ArrayList<>();\r
+ Cvor cvor = pronadji(koren, sef);\r
+ if (cvor != null) {\r
+ sveOsobe(cvor, osobe);\r
+ }\r
+ return osobe;\r
+ }\r
+\r
+ // Ispisuje sve puteve u stablu od korena do svih listova\r
+ public void odDirektoraDoSpremacice() {\r
+ List<Osoba> put = new ArrayList<>();\r
+ odDirektoraDoSpremacice(koren, put);\r
+ }\r
+\r
+ protected static void odDirektoraDoSpremacice(Cvor cvor, List<Osoba> put) {\r
+ if (cvor == null) {\r
+ return;\r
+ }\r
+ put.add(cvor.osoba);\r
+ if ((cvor.levo == null) && (cvor.desno == null)) {\r
+ Svetovid.out.println(put);\r
+ }\r
+ odDirektoraDoSpremacice(cvor.levo, put);\r
+ odDirektoraDoSpremacice(cvor.desno, put);\r
+ put.remove(put.size() - 1);\r
+ }\r
+}\r
+\r
+// Glavna klasa\r
+public class StabloOsobaProgram {\r
+\r
+ // Glavni program\r
+ public static void main(String[] args) {\r
+\r
+ // Napravimo pomocni objekat za ucitavanje i ispisivanje\r
+ TreeIO<StabloOsoba> io = new TreeIO<>(StabloOsoba.class);\r
+\r
+ // Procitamo stablo iz fajla\r
+ StabloOsoba stablo = io.read(Svetovid.in("Osobe.txt"));\r
+\r
+ // Ispisemo ucitano stablo\r
+ io.print(Svetovid.out, stablo);\r
+\r
+ // Osoba koju cemo traziti u stablu \r
+ Osoba osobaX = new Osoba("Nikola", "Nikolic-Nikolic", 0);\r
+\r
+ // Broj osoba\r
+ int br = stablo.brojOsoba();\r
+ Svetovid.out.println();\r
+ Svetovid.out.println("Broj osoba u firmi: " + br);\r
+\r
+ // Stampanje svih osoba\r
+ Svetovid.out.println();\r
+ Svetovid.out.println("Te osobe su: ");\r
+ stablo.stampajSveOsobe();\r
+\r
+ // Preuzimanje osoba u listu\r
+ List<Osoba> sveOsobe = stablo.sveOsobe();\r
+ Svetovid.out.println();\r
+ Svetovid.out.println("Ili kako lista: " + sveOsobe);\r
+\r
+ // Podstablo sa Nikolom kao korenom\r
+ StabloOsoba podstablo = stablo.pronadji(osobaX);\r
+ Svetovid.out.println();\r
+ Svetovid.out.println(osobaX + " i podredjeni:");\r
+ io.print(Svetovid.out, podstablo);\r
+\r
+ // Ko je Nikolin sef\r
+ Svetovid.out.println();\r
+ Osoba sef = stablo.sefOd(osobaX);\r
+ if (sef != null) {\r
+ Svetovid.out.println("Sef od " + osobaX + " je " + sef);\r
+ } else {\r
+ Svetovid.out.println(osobaX + " je direktor");\r
+ }\r
+\r
+ // Plate\r
+ int plata = podstablo.getDirektor().getPlata();\r
+ Svetovid.out.println();\r
+ Svetovid.out.println("Plata od " + podstablo.getDirektor() + " je " + plata + "din");\r
+ List<Osoba> sviSaPlatomIspod = stablo.sviSaPlatomIspod(plata);\r
+ Svetovid.out.println();\r
+ Svetovid.out.println("Svi koji imaju platu manju od " + podstablo.getDirektor() + " su: " + sviSaPlatomIspod);\r
+\r
+ // Podredjeni\r
+ List<Osoba> sviPodredjeni = stablo.sviPodredjeni(osobaX);\r
+ Svetovid.out.println();\r
+ Svetovid.out.println("Svi koji podredjeni od " + podstablo.getDirektor() + " su: " + sviPodredjeni);\r
+\r
+ // Struktura firme od diroktora do svakog zaposlenog koji nema podredjene\r
+ Svetovid.out.println();\r
+ Svetovid.out.println("Hijerarhija sefova za svakog zaposlenog koji nema svoje podredjene:");\r
+ stablo.odDirektoraDoSpremacice();\r
+\r
+ }\r
+}\r