Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    primarykey
    data
    text
    <p>There isn't a direct replacement for the setw and setfill methods in Java. However you can create a new object that wraps a PrintStream and adds the required padding when you write some output. For example:</p> <pre><code>import java.io.PrintStream; import java.util.Arrays; public class PaddedWriter { private int width = 0; private char fillChar = ' '; private final PrintStream writer; public PaddedWriter(PrintStream writer) { this.writer = writer; } void setw(int i) { width = i; } void setfill(char c) { fillChar = c; } void write(String str) { write(str.toCharArray()); } void write(char[] buf) { if (buf.length &lt; width) { char[] pad = new char[width - buf.length]; Arrays.fill( pad, fillChar ); writer.print(pad); } writer.print( buf ); setw(0); } void write() { char[] pad = new char[width]; Arrays.fill( pad, fillChar ); writer.print(pad); setw(0); } void endl() { writer.println(); setw(0); } } </code></pre> <p>Using the PaddedWriter class it is possible to reimplement the code from <a href="http://www.ihas1337code.com/2010/09/how-to-pretty-print-binary-tree.html" rel="nofollow">http://www.ihas1337code.com/2010/09/how-to-pretty-print-binary-tree.html</a> as follows:</p> <pre><code>import java.util.Deque; import java.util.Iterator; import java.util.LinkedList; public class BinaryTree&lt;T&gt; { final T data; BinaryTree&lt;T&gt; left; BinaryTree&lt;T&gt; right; public BinaryTree(T t) { data = t; } public void setLeft(BinaryTree&lt;T&gt; t) { left = t; } public void setRight(BinaryTree&lt;T&gt; t) { right = t; } public BinaryTree&lt;T&gt; getLeft() { return left; } public BinaryTree&lt;T&gt; getRight() { return right; } @Override public String toString() { if (data == null) { return "null"; } else { return data.toString(); } } // Search for the deepest part of the tree private static &lt;T&gt;int maxHeight(BinaryTree&lt;T&gt; t) { if (t == null) return 0; int leftHeight = maxHeight( t.getLeft() ); int rightHeight = maxHeight( t.getRight() ); return (leftHeight &gt; rightHeight) ? leftHeight+1: rightHeight+1; } // Pretty formatting of a binary tree to the output stream public static &lt;T&gt;void printPretty(BinaryTree&lt;T&gt; tree, int level, int indentSpace, PaddedWriter out) { int h = maxHeight( tree ); int nodesInThisLevel = 1; int branchLen = 2*((int)Math.pow( 2.0, h )-1) - (3-level) *(int)Math.pow( 2.0, h-1 ); int nodeSpaceLen = 2+(level+1)*(int)Math.pow(2.0,h); int startLen = branchLen + (3-level) + indentSpace; Deque&lt;BinaryTree&lt;T&gt;&gt; nodesQueue = new LinkedList&lt;BinaryTree&lt;T&gt;&gt;(); nodesQueue.offerLast( tree ); for (int r = 1; r &lt; h; r++) { printBranches( branchLen, nodeSpaceLen, startLen, nodesInThisLevel, nodesQueue, out ); branchLen = branchLen/2 - 1; nodeSpaceLen = nodeSpaceLen/2 + 1; startLen = branchLen + (3-level) + indentSpace; printNodes(branchLen, nodeSpaceLen, startLen, nodesInThisLevel, nodesQueue, out); for (int i = 0; i &lt; nodesInThisLevel; i++) { BinaryTree&lt;T&gt; currNode = nodesQueue.pollFirst(); if (currNode!=null) { nodesQueue.offerLast( currNode.getLeft() ); nodesQueue.offerLast( currNode.getRight() ); } else { nodesQueue.offerLast( null ); nodesQueue.offerLast( null ); } } nodesInThisLevel *= 2; } printBranches(branchLen, nodeSpaceLen, startLen, nodesInThisLevel, nodesQueue, out); printLeaves(indentSpace, level, nodesInThisLevel, nodesQueue, out); } private static &lt;T&gt;void printBranches(int branchLen, int nodeSpaceLen, int startLen, int nodesInThisLevel, Deque&lt;BinaryTree&lt;T&gt;&gt; nodesQueue, PaddedWriter out) { Iterator&lt;BinaryTree&lt;T&gt;&gt; iterator = nodesQueue.iterator(); for (int i = 0; i &lt; nodesInThisLevel/2; i++) { if (i == 0) { out.setw(startLen-1); } else { out.setw(nodeSpaceLen-2); } out.write(); BinaryTree&lt;T&gt; next = iterator.next(); if (next != null) { out.write( "/" ); } else { out.write(" "); } out.setw(2*branchLen+2); out.write(); next = iterator.next(); if (next != null) { out.write( "\\" ); } else { out.write( " " ); } } out.endl(); } // Print the branches and node (eg, ___10___ ) private static &lt;T&gt;void printNodes(int branchLen, int nodeSpaceLen, int startLen, int nodesInThisLevel, Deque&lt;BinaryTree&lt;T&gt;&gt; nodesQueue, PaddedWriter out) { Iterator&lt;BinaryTree&lt;T&gt;&gt; iterator = nodesQueue.iterator(); BinaryTree&lt;T&gt; currentNode; for (int i = 0 ; i &lt; nodesInThisLevel; i++) { currentNode = iterator.next(); if (i == 0) { out.setw(startLen ); } else { out.setw(nodeSpaceLen ); } out.write(); if (currentNode != null &amp;&amp; currentNode.getLeft() != null) { out.setfill( '_' ); } else { out.setfill( ' ' ); } out.setw( branchLen+2 ); if (currentNode != null) { out.write(currentNode.toString()); } else { out.write(); } if (currentNode != null &amp;&amp; currentNode.getRight() != null) { out.setfill( '_' ); } else { out.setfill( ' ' ); } out.setw(branchLen); out.write(); out.setfill(' '); } out.endl(); } // Print the leaves only (just for the bottom row) private static &lt;T&gt;void printLeaves(int indentSpace, int level, int nodesInThisLevel, Deque&lt;BinaryTree&lt;T&gt;&gt; nodesQueue, PaddedWriter out) { Iterator&lt;BinaryTree&lt;T&gt;&gt; iterator = nodesQueue.iterator(); BinaryTree&lt;T&gt; currentNode; for (int i = 0; i &lt; nodesInThisLevel; i++) { currentNode = iterator.next(); if (i == 0) { out.setw(indentSpace+2); } else { out.setw(2*level+2); } if (currentNode !=null) { out.write(currentNode.toString()); } else { out.write(); } } out.endl(); } } </code></pre> <p>It can be tested with this class:</p> <pre><code>public class Tester { public static void main( String[] args ) { BinaryTree&lt;Integer&gt; root = new BinaryTree&lt;Integer&gt;(30); root.setLeft(new BinaryTree&lt;Integer&gt;(20)); root.setRight(new BinaryTree&lt;Integer&gt;(40)); root.getLeft().setLeft(new BinaryTree&lt;Integer&gt;(10)); root.getLeft().setRight(new BinaryTree&lt;Integer&gt;(25)); root.getRight().setLeft(new BinaryTree&lt;Integer&gt;(35)); root.getRight().setRight(new BinaryTree&lt;Integer&gt;(50)); root.getLeft().getLeft().setLeft(new BinaryTree&lt;Integer&gt;(5)); root.getLeft().getLeft().setRight(new BinaryTree&lt;Integer&gt;(15)); root.getLeft().getRight().setRight(new BinaryTree&lt;Integer&gt;(28)); root.getRight().getRight().setLeft(new BinaryTree&lt;Integer&gt;(41)); BinaryTree.printPretty( root, 1, 0, new PaddedWriter( System.out ) ); } } </code></pre> <p>Something that you might want to take into account if you use this code is that the width of the node is not taken into account when working out the spacing. So if you have add a node containing 123456789 it will not print nicely.</p>
    singulars
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. VO
      singulars
      1. This table or related slice is empty.
    2. VO
      singulars
      1. This table or related slice is empty.
    3. VO
      singulars
      1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload