gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
Stabla, dodati primeri algoritama nad stablima
[spa2-materijali.git] / Stabla / Primeri za test / StabloIOPretty.java
diff --git a/Stabla/Primeri za test/StabloIOPretty.java b/Stabla/Primeri za test/StabloIOPretty.java
new file mode 100644 (file)
index 0000000..6fcc069
--- /dev/null
@@ -0,0 +1,224 @@
+import java.util.ArrayList;\r
+import java.util.List;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import org.svetovid.io.SvetovidReader;\r
+import org.svetovid.io.SvetovidWriter;\r
+\r
+/**\r
+ * Format:\r
+ *   /-- desni\r
+ * -(id) vrednost\r
+ *   \-- levi\r
+ */\r
+public class StabloIOPretty implements StabloIO {\r
+\r
+    protected static final String EMPTY_SYMBOL = " ";\r
+    protected static final String RIGHT_SYMBOL = "/";\r
+    protected static final String VERTICAL_SYMBOL = "|";\r
+    protected static final String LEFT_SYMBOL = "\\";\r
+    protected static final String HORIZONTAL_SYMBOL = "-";\r
+\r
+    protected String nullSymbol;\r
+    protected boolean separated;\r
+    protected int length;\r
+\r
+    public StabloIOPretty() {\r
+        this(null, false, 7);\r
+    }\r
+\r
+    public StabloIOPretty(String nullSymbol, boolean separated, int length) {\r
+        this.nullSymbol = nullSymbol;\r
+        this.separated = separated;\r
+        this.length = length;\r
+    }\r
+\r
+    public String getNullSymbol() {\r
+        return nullSymbol;\r
+    }\r
+\r
+    public void setNullSymbol(String nullSymbol) {\r
+        this.nullSymbol = nullSymbol;\r
+    }\r
+\r
+    public boolean isSeparated() {\r
+        return separated;\r
+    }\r
+\r
+    public void setSeparated(boolean separated) {\r
+        this.separated = separated;\r
+    }\r
+\r
+    public int getLength() {\r
+        return length;\r
+    }\r
+\r
+    public void setLength(int length) {\r
+        if (length < 3) {\r
+            throw new IllegalArgumentException("length");\r
+        }\r
+        this.length = length;\r
+    }\r
+\r
+    @Override\r
+    public Stablo readStablo(SvetovidReader in) {\r
+        return parseStablo(in, nullSymbol, length);\r
+    }\r
+\r
+    protected Stablo parseStablo(SvetovidReader in, String nullSymbol, int length) {\r
+        List<Stablo> elements = new ArrayList<>();\r
+        List<Integer> levels = new ArrayList<>();\r
+        Pattern levelPattern = Pattern.compile("[\\Q" + LEFT_SYMBOL + HORIZONTAL_SYMBOL + RIGHT_SYMBOL + "\\E]");\r
+        String line = in.readLine();\r
+        while ((line != null) && !line.isEmpty()) {\r
+            Matcher matcher = levelPattern.matcher(line);\r
+            int level = -1;\r
+            if (matcher.find()) {\r
+                level = matcher.start();\r
+            }\r
+            if (level != -1 && (nullSymbol == null || !line.endsWith(nullSymbol))) {\r
+                Stablo stablo = parseStablo(line);\r
+                elements.add(stablo);\r
+                levels.add(level);\r
+            }\r
+            line = in.readLine();\r
+        }\r
+        Stablo stablo = formStablo(0, elements.size(), levels, elements);\r
+        return stablo;\r
+    }\r
+\r
+    private Stablo parseStablo(String line) {\r
+        int id = -1;\r
+        String vrednost = null;\r
+        int beginIndex = line.indexOf('(');\r
+        int endIndex = line.indexOf(')');\r
+        if ((beginIndex != -1) && (endIndex != -1) && (beginIndex < endIndex)) {\r
+            vrednost = line.substring(beginIndex + 1, endIndex);\r
+            try {\r
+                id = Integer.parseInt(vrednost);\r
+            } catch (NumberFormatException e) {\r
+                throw new NumberFormatException(line);\r
+            }\r
+            vrednost = line.substring(endIndex + 2);\r
+        } else {\r
+            throw new NumberFormatException(line);\r
+        }\r
+        Stablo stablo = new Stablo(id, vrednost);\r
+        return stablo;\r
+    }\r
+\r
+    private Stablo formStablo(int beginIndex, int endIndex, List<Integer> levels, List<Stablo> elements) {\r
+        if (beginIndex >= endIndex) {\r
+            return null;\r
+        }\r
+        int minIndex = beginIndex;\r
+        int minLevel = levels.get(minIndex);\r
+        for (int i = beginIndex + 1; i < endIndex; i++) {\r
+            int level = levels.get(i);\r
+            if (level < minLevel) {\r
+                minLevel = level;\r
+                minIndex = i;\r
+            }\r
+        }\r
+        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
+        return stablo;\r
+    }\r
+\r
+    @Override\r
+    public void printStablo(SvetovidWriter out, Stablo stablo) {\r
+        StringBuilder builder = new StringBuilder();\r
+        appendTree(builder, stablo, nullSymbol, separated, length);\r
+        out.print(builder.toString());\r
+    }\r
+\r
+    protected void appendTree(StringBuilder builder, Stablo stablo, String nullSymbol, boolean separated, int length) {\r
+        String[] buildingBlocks = generateBuildingBlocks(length);\r
+        appendRight(builder, stablo, nullSymbol, separated, buildingBlocks, true, buildingBlocks[5]);\r
+        appendNode(builder, stablo, nullSymbol != null ? nullSymbol : "|", buildingBlocks[4]);\r
+        appendLeft(builder, stablo, nullSymbol, separated, buildingBlocks, false, buildingBlocks[5]);\r
+    }\r
+\r
+    protected void appendNode(StringBuilder builder, Stablo stablo, String nullSymbol, String prefix) {\r
+        builder.append(prefix);\r
+        if (stablo == null) {\r
+            builder.append(nullSymbol);\r
+        } else {\r
+            builder.append("(");\r
+            builder.append(stablo.id);\r
+            builder.append(") ");\r
+            builder.append(stablo.vrednost);\r
+        }\r
+        builder.append("\n");\r
+    }\r
+\r
+    protected void appendRight(StringBuilder builder, Stablo stablo, String nullSymbol, boolean separated, String[] buildingBlocks, boolean isRight, String prefix) {\r
+        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 (separated) {\r
+                appendEmpty(builder, buildingBlocks, prefix);\r
+            }\r
+        }\r
+    }\r
+\r
+    protected void appendLeft(StringBuilder builder, Stablo stablo, String nullSymbol, boolean separated, String[] buildingBlocks, boolean isRight, String prefix) {\r
+        if (stablo == null) {\r
+            return;\r
+        }\r
+        if ((nullSymbol != null) || (stablo.levi != null)) {\r
+            if (separated) {\r
+                appendEmpty(builder, buildingBlocks, prefix);\r
+            }\r
+            appendSubtree(builder, stablo.levi, nullSymbol, separated, buildingBlocks, false, prefix);\r
+        }\r
+    }\r
+\r
+    protected void appendEmpty(StringBuilder builder, String[] buildingBlocks, String prefix) {\r
+        builder.append(prefix);\r
+        builder.append(buildingBlocks[2]);\r
+        builder.append("\n");\r
+    }\r
+\r
+    protected void appendSubtree(StringBuilder builder, Stablo stablo, String nullSymbol, boolean separated, String[] buildingBlocks, boolean isRight, String prefix) {\r
+        String mojPrefix = prefix;\r
+        if (isRight == true) {\r
+            mojPrefix = mojPrefix + buildingBlocks[1];\r
+        }\r
+        if (isRight == false) {\r
+            mojPrefix = mojPrefix + buildingBlocks[3];\r
+        }\r
+        String noviPrefix = prefix + (!isRight ? buildingBlocks[2] : buildingBlocks[0]);\r
+        appendRight(builder, stablo, nullSymbol, separated, buildingBlocks, isRight, noviPrefix);\r
+        appendNode(builder, stablo, nullSymbol, mojPrefix);\r
+        noviPrefix = prefix + (isRight ? buildingBlocks[2] : buildingBlocks[0]);\r
+        appendLeft(builder, stablo, nullSymbol, separated, buildingBlocks, isRight, noviPrefix);\r
+    }\r
+\r
+    private String[] generateBuildingBlocks(int length) {\r
+        String[] blocks = new String[6];\r
+        blocks[0] = generateBlock(EMPTY_SYMBOL, EMPTY_SYMBOL, EMPTY_SYMBOL, length - 2);\r
+        blocks[1] = generateBlock(EMPTY_SYMBOL, RIGHT_SYMBOL, HORIZONTAL_SYMBOL, length - 2);\r
+        blocks[2] = generateBlock(EMPTY_SYMBOL, VERTICAL_SYMBOL, EMPTY_SYMBOL, length - 2);\r
+        blocks[3] = generateBlock(EMPTY_SYMBOL, LEFT_SYMBOL, HORIZONTAL_SYMBOL, length - 2);\r
+        blocks[4] = HORIZONTAL_SYMBOL;\r
+        blocks[5] = EMPTY_SYMBOL;\r
+        return blocks;\r
+    }\r
+\r
+    protected String generateBlock(String emptySymbol, String startSymbol, String repeatSymbol, int repeatCount) {\r
+        StringBuilder builder = new StringBuilder();\r
+        builder.append(emptySymbol);\r
+        builder.append(startSymbol);\r
+        for (int i = 0; i < repeatCount; i++) {\r
+            builder.append(repeatSymbol);\r
+        }\r
+        return builder.toString();\r
+    }\r
+}\r
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner