gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control systemdiff --git a/Stabla/Primeri za test/StabloIOPretty.java b/Stabla/Primeri za test/StabloIOPretty.java
+++ /dev/null
@@ -1,230 +0,0 @@
-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
- * 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
- 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.setLevi(levi);\r
- stablo.setDesni(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.getId());\r
- builder.append(") ");\r
- builder.append(stablo.getVrednost());\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.getDesni() != null)) {\r
- appendSubtree(builder, stablo.getDesni(), 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.getLevi() != null)) {\r
- if (separated) {\r
- appendEmpty(builder, buildingBlocks, prefix);\r
- }\r
- appendSubtree(builder, stablo.getLevi(), 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