gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Stabla, dodati komentari i ideje za veliki test
authorIvan Pribela <ivanpribela@gmail.com>
Sat, 7 Nov 2015 17:44:57 +0000 (18:44 +0100)
committerIvan Pribela <ivanpribela@gmail.com>
Sat, 7 Nov 2015 17:44:57 +0000 (18:44 +0100)
Stabla/Primeri za test/StabloIO.java
Stabla/Primeri za test/StabloIOClassic.java
Stabla/Primeri za test/StabloIOIndent.java
Stabla/Primeri za test/StabloIOPretty.java
Stabla/Primeri za test/StabloIORandom.java
Stabla/Primeri za test/StabloProgram.java

index 59984d3..f0cab85 100644 (file)
@@ -1,6 +1,11 @@
 import org.svetovid.io.SvetovidReader;\r
 import org.svetovid.io.SvetovidWriter;\r
 \r
+/*\r
+ * Ovaj interfejs i klase koje ga implementiraju sluze za ucitavanje i\r
+ * snimanje stabala. Nije potrebno znati ih, i bice dati, prilikom izrade\r
+ * prakticnih zadataka.\r
+ */\r
 public interface StabloIO {\r
 \r
     public Stablo readStablo(SvetovidReader in);\r
index dcf1d9f..d6b0445 100644 (file)
@@ -3,11 +3,16 @@ import java.util.NoSuchElementException;
 import org.svetovid.io.SvetovidReader;\r
 import org.svetovid.io.SvetovidWriter;\r
 \r
-/**\r
- * Format:\r
+/*\r
+ * Ova klasa sluzi za ucitavanje i snimanje stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ *\r
+ * Ocekivani format fajla je sledeci:\r
  *\r
  * br\r
  * id leviId desniId vrednost (x br)\r
+ *\r
+ * Primer fajla je classic.txt\r
  */\r
 public class StabloIOClassic implements StabloIO {\r
 \r
@@ -32,13 +37,13 @@ public class StabloIOClassic implements StabloIO {
         if (stablo == null) {\r
             return element;\r
         }\r
-        Stablo found = find(stablo, element.id);\r
+        Stablo found = find(stablo, element.getId());\r
         if (found == null) {\r
-            throw new NoSuchElementException("id: " + element.id);\r
+            throw new NoSuchElementException("id: " + element.getId());\r
         }\r
-        found.vrednost = element.vrednost;\r
-        found.levi = element.levi;\r
-        found.desni = element.desni;\r
+        found.setVrednost(element.getVrednost());\r
+        found.setLevi(element.getLevi());\r
+        found.setDesni(element.getDesni());\r
         return stablo;\r
     }\r
 \r
@@ -46,14 +51,14 @@ public class StabloIOClassic implements StabloIO {
         if (stablo == null) {\r
             return null;\r
         }\r
-        if (stablo.id == id) {\r
+        if (stablo.getId() == id) {\r
             return stablo;\r
         }\r
-        Stablo rezultat = find(stablo.levi, id);\r
+        Stablo rezultat = find(stablo.getLevi(), id);\r
         if (rezultat != null) {\r
             return rezultat;\r
         }\r
-        return find(stablo.desni, id);\r
+        return find(stablo.getDesni(), id);\r
     }\r
 \r
     @Override\r
@@ -67,19 +72,19 @@ public class StabloIOClassic implements StabloIO {
         if (stablo == null) {\r
             return 0;\r
         }\r
-        return 1 + count(stablo.levi) + count(stablo.desni);\r
+        return 1 + count(stablo.getLevi()) + count(stablo.getDesni());\r
     }\r
 \r
     private static void iterate(SvetovidWriter out, Stablo stablo) {\r
         if (stablo == null) {\r
             return;\r
         }\r
-        int id = stablo.id;\r
-        int leviId = stablo.levi == null ? -1 : stablo.levi.id;\r
-        int desniId = stablo.desni == null ? -1 : stablo.desni.id;\r
-        String vrednost = stablo.vrednost;\r
+        int id = stablo.getId();\r
+        int leviId = stablo.getLevi() == null ? -1 : stablo.getLevi().getId();\r
+        int desniId = stablo.getDesni() == null ? -1 : stablo.getDesni().getId();\r
+        String vrednost = stablo.getVrednost();\r
         out.println(id, leviId, desniId, vrednost);\r
-        iterate(out, stablo.levi);\r
-        iterate(out, stablo.desni);\r
+        iterate(out, stablo.getLevi());\r
+        iterate(out, stablo.getDesni());\r
     }\r
 }\r
index 8e9dc83..dede26b 100644 (file)
@@ -2,12 +2,17 @@ import org.svetovid.SvetovidFormatException;
 import org.svetovid.io.SvetovidReader;\r
 import org.svetovid.io.SvetovidWriter;\r
 \r
-/**\r
- * Format:\r
+/*\r
+ * Ova klasa sluzi za ucitavanje i snimanje stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ *\r
+ * Ocekivani format fajla je sledeci:\r
  *\r
  * id vrednost\r
- * levi\r
- * desni\r
+ *   levi\r
+ *   desni\r
+ *\r
+ * Primer fajla je indent.txt\r
  */\r
 public class StabloIOIndent implements StabloIO {\r
 \r
@@ -63,11 +68,11 @@ public class StabloIOIndent implements StabloIO {
             out.println(prefix + nullSymbol);\r
             return;\r
         }\r
-        int id = stablo.id;\r
-        String vrednost = stablo.vrednost;\r
+        int id = stablo.getId();\r
+        String vrednost = stablo.getVrednost();\r
         out.print(prefix);\r
         out.println(id, vrednost);\r
-        write(out, stablo.levi, nullSymbol, indent, prefix + indent);\r
-        write(out, stablo.desni, nullSymbol, indent, prefix + indent);\r
+        write(out, stablo.getLevi(), nullSymbol, indent, prefix + indent);\r
+        write(out, stablo.getDesni(), nullSymbol, indent, prefix + indent);\r
     }\r
 }\r
index 6fcc069..2df3c03 100644 (file)
@@ -6,11 +6,17 @@ import java.util.regex.Pattern;
 import org.svetovid.io.SvetovidReader;\r
 import org.svetovid.io.SvetovidWriter;\r
 \r
-/**\r
- * Format:\r
+/*\r
+ * Ova klasa sluzi za ucitavanje i snimanje stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ *\r
+ * Ocekivani format fajla je sledeci:\r
+ *\r
  *   /-- desni\r
  * -(id) vrednost\r
  *   \-- levi\r
+ *\r
+ * Primer fajla je pretty.txt\r
  */\r
 public class StabloIOPretty implements StabloIO {\r
 \r
@@ -124,8 +130,8 @@ public class StabloIOPretty implements StabloIO {
         Stablo stablo = elements.get(minIndex);\r
         Stablo levi = formStablo(minIndex + 1, endIndex, levels, elements);\r
         Stablo desni = formStablo(beginIndex, minIndex, levels, elements);\r
-        stablo.levi = levi;\r
-        stablo.desni = desni;\r
+        stablo.setLevi(levi);\r
+        stablo.setDesni(desni);\r
         return stablo;\r
     }\r
 \r
@@ -149,9 +155,9 @@ public class StabloIOPretty implements StabloIO {
             builder.append(nullSymbol);\r
         } else {\r
             builder.append("(");\r
-            builder.append(stablo.id);\r
+            builder.append(stablo.getId());\r
             builder.append(") ");\r
-            builder.append(stablo.vrednost);\r
+            builder.append(stablo.getVrednost());\r
         }\r
         builder.append("\n");\r
     }\r
@@ -160,8 +166,8 @@ public class StabloIOPretty implements StabloIO {
         if (stablo == null) {\r
             return;\r
         }\r
-        if ((nullSymbol != null) || (stablo.desni != null)) {\r
-            appendSubtree(builder, stablo.desni, nullSymbol, separated, buildingBlocks, true, prefix);\r
+        if ((nullSymbol != null) || (stablo.getDesni() != null)) {\r
+            appendSubtree(builder, stablo.getDesni(), nullSymbol, separated, buildingBlocks, true, prefix);\r
             if (separated) {\r
                 appendEmpty(builder, buildingBlocks, prefix);\r
             }\r
@@ -172,11 +178,11 @@ public class StabloIOPretty implements StabloIO {
         if (stablo == null) {\r
             return;\r
         }\r
-        if ((nullSymbol != null) || (stablo.levi != null)) {\r
+        if ((nullSymbol != null) || (stablo.getLevi() != null)) {\r
             if (separated) {\r
                 appendEmpty(builder, buildingBlocks, prefix);\r
             }\r
-            appendSubtree(builder, stablo.levi, nullSymbol, separated, buildingBlocks, false, prefix);\r
+            appendSubtree(builder, stablo.getLevi(), nullSymbol, separated, buildingBlocks, false, prefix);\r
         }\r
     }\r
 \r
index d3a98ca..f5880c4 100644 (file)
@@ -5,6 +5,10 @@ import java.util.concurrent.atomic.AtomicInteger;
 import org.svetovid.io.SvetovidReader;\r
 import org.svetovid.io.SvetovidWriter;\r
 \r
+/*\r
+ * Ova klasa sluzi za generisanje random stabala. Nije potrebno znati je,\r
+ * i bice data, prilikom izrade prakticnih zadataka.\r
+ */\r
 public class StabloIORandom implements StabloIO {\r
 \r
     protected long seed;\r
@@ -58,9 +62,9 @@ public class StabloIORandom implements StabloIO {
     }\r
 \r
     private Stablo readStablo(Random random, AtomicInteger sequence, int length, int depth) {\r
-       if (depth <= 0) {\r
-               return null;\r
-       }\r
+        if (depth <= 0) {\r
+            return null;\r
+        }\r
         int id = sequence.addAndGet(1 + random.nextInt(9));\r
         String vrednost = new BigInteger(length, random).toString(36);\r
         Stablo desni = readStablo(random, sequence, length + random.nextInt(5), depth - random.nextInt(5));\r
index 148ce7b..ee70ace 100644 (file)
@@ -1,12 +1,16 @@
 import java.util.ArrayList;\r
 import java.util.List;\r
+import java.util.Objects;\r
 \r
+// Tip podataka koji predstavlja binarno stablo\r
+// ID svakog cvora je tipa int a vrednost sadrzana u njemu tipa String\r
+// Na velikom testu, studenti ce dobiti ovu klasu\r
 class Stablo {\r
 \r
-    public final int id;\r
-    public String vrednost;\r
-    public Stablo levi;\r
-    public Stablo desni;\r
+    private final int id;\r
+    private String vrednost;\r
+    private Stablo levi;\r
+    private Stablo desni;\r
 \r
     public Stablo(int id) {\r
         this(id, null);\r
@@ -23,17 +27,110 @@ class Stablo {
         this.desni = desni;\r
     }\r
 \r
+    public int getId() {\r
+        return id;\r
+    }\r
+\r
+    public String getVrednost() {\r
+        return vrednost;\r
+    }\r
+\r
+    public void setVrednost(String vrednost) {\r
+        this.vrednost = vrednost;\r
+    }\r
+\r
+    public Stablo getLevi() {\r
+        return levi;\r
+    }\r
+\r
+    public void setLevi(Stablo levi) {\r
+        this.levi = levi;\r
+    }\r
+\r
+    public Stablo getDesni() {\r
+        return desni;\r
+    }\r
+\r
+    public void setDesni(Stablo desni) {\r
+        this.desni = desni;\r
+    }\r
+\r
     @Override\r
     public String toString() {\r
         return "(" + id + " \"" + vrednost + "\"" + (levi == null ? "" : " " + levi) + (desni == null ? "" : " " + desni) + ")";\r
     }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prostBroj = 31;\r
+        int rezultat = 1;\r
+        rezultat = rezultat * prostBroj + id;\r
+        rezultat = rezultat * prostBroj + ((vrednost == null) ? 0 : vrednost.hashCode());\r
+        rezultat = rezultat * prostBroj + ((levi == null) ? 0 : levi.hashCode());\r
+        rezultat = rezultat * prostBroj + ((desni == null) ? 0 : desni.hashCode());\r
+        return rezultat;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+\r
+        // Objekat je jednak ako je identican\r
+        if (this == obj) {\r
+            return true;\r
+        }\r
+\r
+        // Null je razlicit od svih objekata\r
+        if (obj == null) {\r
+            return false;\r
+        }\r
+\r
+        // Ako su klase objekata razlicite, onda su i objekti razliciti\r
+        if (getClass() != obj.getClass()) {\r
+            return false;\r
+        }\r
+\r
+        // Pretvorimo prosledjeni objekat u stablo\r
+        Stablo that = (Stablo) obj;\r
+\r
+        // Razlicit ID znaci da su objekti razliciti\r
+        if (this.id != that.id) {\r
+            return false;\r
+        }\r
+\r
+        // Takodje i vrednost\r
+        if (Objects.equals(this.vrednost, that.vrednost)) {\r
+            return false;\r
+        }\r
+\r
+        // Potom levo podstablo\r
+        if (Objects.equals(this.levi, that.levi)) {\r
+            return false;\r
+        }\r
+\r
+        // Pa desno podstablo\r
+        if (Objects.equals(this.desni, that.desni)) {\r
+            return false;\r
+        }\r
+\r
+        // Sva polja se poklapaju\r
+        return true;\r
+\r
+    }\r
 }\r
 \r
+// Glavni program\r
+// Na velikom testu ce biti dat kostur koji ucitava potrebno stablo\r
+// Od studenata ce se ocekivati da implementiraju neki algoritam poput\r
+// statickih metoda koje se pozivaju u ovoj klasi\r
 public class StabloProgram {\r
 \r
     public static void main(String[] args) {\r
 \r
-        // Ucitavanje stabla\r
+        // Ucitavanje stabla iz fajla u "pretty" formatu\r
+        // StabloIO inIO = new StabloIOPretty();\r
+        // Stablo stablo = inIO.readStablo(Svetovid.in("pretty.txt"));\r
+\r
+        // Generisanje random stabla\r
         StabloIO inIO = new StabloIORandom(12345);\r
         Stablo stablo = inIO.readStablo(null);\r
 \r
@@ -47,12 +144,12 @@ public class StabloProgram {
         Svetovid.out.println("Broj nivoa:", brojNivoa);\r
         Svetovid.out.println();\r
 \r
-        // Broj nivoa\r
+        // Broj elemenata\r
         int brojElementata = brojElementata(stablo);\r
         Svetovid.out.println("Broj elementata:", brojElementata);\r
         Svetovid.out.println();\r
 \r
-        // Broj nivoa\r
+        // Najduza String vrednost u stablu\r
         String najduzaVrednost = najduzaVrednost(stablo);\r
         Svetovid.out.println("Najduza vrednost:", najduzaVrednost);\r
         Svetovid.out.println();\r
@@ -66,29 +163,49 @@ public class StabloProgram {
         outIO.printStablo(Svetovid.out, obrnuto);\r
         Svetovid.out.println();\r
 \r
+        // Implementacije ovih algoritama su date ispod kao staticki metodi\r
+        // Za veliki test, od studenata ce se ocekivati da na isti nacin\r
+        // implementiraju algoritam koji se bude trazio u zadatku.\r
+        //\r
+        // Pored ovde implementiranih algoritama, sledi i par ideja za vezbanje:\r
+        // - Ispisati vrednosti cvorova sa parnim IDom\r
+        // - Ispisati sve vrednosti cvorova na nivou koji se ucitava sa tastature\r
+        // - Utvrditi da li postoji postoji putanja od korena do lista koja sadrzi\r
+        //   string duzine 5\r
+        // - Napraviti novo stablo iste strukture ali sa svim vrednostima ALL CAPS\r
+        // - Proveriti da li je dato stablo binarno stablo pretrazivanj, tj. da\r
+        //   su sve vrednosti u levom podstablu leksikografski pre vrednosti u\r
+        //   korenu, svi elementi u desnom leksikografski posle, i ovo takodje\r
+        //   vazi za oba podstabla\r
+        // - Koliko ima cvorova na nivou 7\r
+        // - Koliko se puta string "abc" javlja u stablu\r
+\r
     }\r
 \r
+    // Vraca ukupan broj elemenata u stablu\r
     private static int brojElementata(Stablo stablo) {\r
         if (stablo == null) {\r
-            return 0;\r
+            return 0; // Prazno stablo ima 0 elemenata\r
         }\r
-        return 1 + brojElementata(stablo.levi) + brojElementata(stablo.desni);\r
+        return 1 + brojElementata(stablo.getLevi()) + brojElementata(stablo.getDesni());\r
     }\r
 \r
+    // Vraca visinu stabla\r
     private static int brojNivoa(Stablo stablo) {\r
         if (stablo == null) {\r
-            return 0;\r
+            return 0; // Prazno stablo je visine 0\r
         }\r
-        return 1 + Math.max(brojNivoa(stablo.levi), brojNivoa(stablo.desni));\r
+        return 1 + Math.max(brojNivoa(stablo.getLevi()), brojNivoa(stablo.getDesni()));\r
     }\r
 \r
+    // Vraca najduzi string sadrzan kao vrednos u nekom od cvorova\r
     private static String najduzaVrednost(Stablo stablo) {\r
         if (stablo == null) {\r
-            return null;\r
+            return null; // Prazno stablo ne sadrzi vrednosti\r
         }\r
-        String rezultat = stablo.vrednost;\r
-        String levaVrednost = najduzaVrednost(stablo.levi);\r
-        String desnaVrednost = najduzaVrednost(stablo.desni);\r
+        String rezultat = stablo.getVrednost();\r
+        String levaVrednost = najduzaVrednost(stablo.getLevi());\r
+        String desnaVrednost = najduzaVrednost(stablo.getDesni());\r
         if (rezultat == null || (levaVrednost != null && rezultat.length() < levaVrednost.length())) {\r
             rezultat = levaVrednost;\r
         }\r
@@ -98,26 +215,28 @@ public class StabloProgram {
         return rezultat;\r
     }\r
 \r
+    // Ispisuje sve puteve od korena do listova\r
     private static void sviPutevi(Stablo stablo, List<String> put) {\r
         if (stablo == null) {\r
             return;\r
         }\r
-        put.add(stablo.vrednost);\r
-        if ((stablo.levi == null) && (stablo.desni == null)) {\r
+        put.add(stablo.getVrednost());\r
+        if ((stablo.getLevi() == null) && (stablo.getDesni() == null)) {\r
             Svetovid.out.println("Put: " + put);\r
         }\r
-        sviPutevi(stablo.levi, put);\r
-        sviPutevi(stablo.desni, put);\r
+        sviPutevi(stablo.getLevi(), put);\r
+        sviPutevi(stablo.getDesni(), put);\r
         put.remove(put.size() - 1);\r
     }\r
 \r
+    // Vraca obrnuto stablo od datog\r
     private static Stablo obrni(Stablo stablo) {\r
         if (stablo == null) {\r
             return null;\r
         }\r
-        Stablo levi = obrni(stablo.levi);\r
-        Stablo desni = obrni(stablo.desni);\r
-        Stablo obrnuto = new Stablo(stablo.id, stablo.vrednost, desni, levi);\r
+        Stablo levi = obrni(stablo.getLevi());\r
+        Stablo desni = obrni(stablo.getDesni());\r
+        Stablo obrnuto = new Stablo(stablo.getId(), stablo.getVrednost(), desni, levi);\r
         return obrnuto;\r
     }\r
 }\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner