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
diff --git a/Stabla/konkretnoStablo/StabloOsobaProgram.java b/Stabla/konkretnoStablo/StabloOsobaProgram.java
new file mode 100644 (file)
index 0000000..327d75a
--- /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
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner