Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified gradle/wrapper/gradle-wrapper.jar
Binary file not shown.
4 changes: 2 additions & 2 deletions gradle/wrapper/gradle-wrapper.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#Mon May 18 22:22:28 BST 2015
#Wed Nov 27 22:57:21 CET 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.2-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-2.6-all.zip
46 changes: 15 additions & 31 deletions src/main/java/com/monotonic/map_visualiser/Console.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
import java.io.PrintStream;
import java.util.stream.IntStream;

public class Console
{
public class Console {
private static final String ANSI_COLOUR_RESET = "\u001B[0m";
private static final String CLEAR = "\033[H\033[2J";
private static final String ANSI_RED = "\u001B[31m";
Expand All @@ -16,71 +15,56 @@ public class Console
private final PrintStream out;
private final InputStream in;

public Console()
{
public Console() {
this(System.out, System.in);
}

public Console(final PrintStream out, final InputStream in)
{
public Console(final PrintStream out, final InputStream in) {
this.out = out;
this.in = in;
}

public void await()
{
try
{
public void await() {
try {
in.read();
}
catch (IOException e)
{
} catch (IOException e) {
e.printStackTrace();
}
}

public void clear()
{
public void clear() {
print(CLEAR);
}

public void println(final Object value)
{
public void println(final Object value) {
out.println(value);
}

public void print(final Object value)
{
public void print(final Object value) {
out.print(value);
}

public void printf(final String format, final Object... args)
{
public void printf(final String format, final Object... args) {
out.printf(format, args);
}

public void red()
{
public void red() {
print(ANSI_RED);
}

public void yellow()
{
public void yellow() {
print(ANSI_YELLOW);
}

public void green()
{
public void green() {
print(ANSI_GREEN);
}

public void resetColour()
{
public void resetColour() {
print(ANSI_COLOUR_RESET);
}

public void indent(final int index)
{
public void indent(final int index) {
IntStream.range(0, index).forEach(i -> print('\t'));
}
}
84 changes: 35 additions & 49 deletions src/main/java/com/monotonic/map_visualiser/HashMapVisualiser.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,14 @@
import java.util.IntSummaryStatistics;
import java.util.stream.Stream;

public class HashMapVisualiser
{
public class HashMapVisualiser {
private static final Field thresholdField;
private static final Field tableField;
private static final Field nextField;
private static final Field leftField;
private static final Field rightField;

static
{
static {
Type node = new Type("java.util.HashMap$Node");
Type treeNode = new Type("java.util.HashMap$TreeNode");
Type hashMap = new Type(HashMap.class);
Expand All @@ -28,54 +26,48 @@ public class HashMapVisualiser

private final Console console;

public HashMapVisualiser(final Console console)
{
public HashMapVisualiser(final Console console) {
this.console = console;
}

public void visualise(final HashMap<?, ?> map)
{
public void visualise(final HashMap<?, ?> map) {
Object[] table = (Object[]) Type.get(tableField, map);

console.printf(
"Size: %d, Resize: %s, Bin Count: %d%n",
map.size(), Type.get(thresholdField, map), table.length);
"Size: %d, Resize: %s, Bin Count: %d%n",
map.size(), Type.get(thresholdField, map), table.length);

final IntSummaryStatistics collisions = Stream.of(table)
.mapToInt(row ->
{
if (row == null)
.mapToInt(row ->
{
console.println("[]");
return 0;
}
if (row == null) {
console.println("[]");
return 0;
}

switch (row.getClass().getSimpleName())
{
case "TreeNode":
return visualiseTree(row);
switch (row.getClass().getSimpleName()) {
case "TreeNode":
return visualiseTree(row);

case "Node":
return visualiseList(row);
case "Node":
return visualiseList(row);

default:
throw new IllegalArgumentException("Unknown type of row");
}
})
.summaryStatistics();
default:
throw new IllegalArgumentException("Unknown type of row");
}
})
.summaryStatistics();

console.printf(
"Collisions: Max: %d, Ave: %s, Total: %d%n",
collisions.getMax(),
collisions.getAverage(),
collisions.getSum());
"Collisions: Max: %d, Ave: %s, Total: %d%n",
collisions.getMax(),
collisions.getAverage(),
collisions.getSum());
}

private int visualiseList(Object node)
{
private int visualiseList(Object node) {
final Object next = Type.get(nextField, node);
if (next == null)
{
if (next == null) {
console.green();
printNode(node);
console.resetColour();
Expand All @@ -84,8 +76,7 @@ private int visualiseList(Object node)

console.red();
int index = 0;
while (node != null)
{
while (node != null) {
console.indent(index);
printNode(node);

Expand All @@ -97,34 +88,29 @@ private int visualiseList(Object node)
return index;
}

private int visualiseTree(final Object node)
{
private int visualiseTree(final Object node) {
console.yellow();
final int collisions = visualiseSubTree(node, 0);
console.resetColour();
return collisions;
}

private int visualiseSubTree(final Object node, int index)
{
private int visualiseSubTree(final Object node, int index) {
console.indent(index);
printNode(node);

return 1
+ visualiseBranch(node, index, leftField)
+ visualiseBranch(node, index, rightField);
+ visualiseBranch(node, index, leftField)
+ visualiseBranch(node, index, rightField);
}

private void printNode(final Object node)
{
private void printNode(final Object node) {
console.printf("[%s]\n", node);
}

private int visualiseBranch(final Object node, final int index, final Field field)
{
private int visualiseBranch(final Object node, final int index, final Field field) {
Object branch = Type.get(field, node);
if (branch != null)
{
if (branch != null) {
return visualiseSubTree(branch, index + 1);
}
return 0;
Expand Down
38 changes: 19 additions & 19 deletions src/main/java/com/monotonic/map_visualiser/Sample.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,46 +5,46 @@
import java.util.HashMap;

/**
* A simple program that shows at the terminal,
* A simple program that shows at the terminal,
* the structure of sample HashMap and TreeMap instances.
*
*
* @author Manoel Campos da Silva Filho
*/
*/
public class Sample {
private final Console console;
public Sample(){
this.console = new Console();

public Sample() {
this.console = new Console();
printTreeMap();
printHashMap();
}
private void printTreeMap(){

private void printTreeMap() {
TreeMap<String, Object> treeMap1 = new TreeMap<>();
insertSampleMapData(treeMap1);
System.out.println(treeMap1.getClass().getSimpleName());
new TreeMapVisualiser(console).visualise(treeMap1);
System.out.println();
new TreeMapVisualiser(console).visualise(treeMap1);
System.out.println();
}
private void printHashMap(){

private void printHashMap() {
HashMap<String, Object> hashMap1 = new HashMap<>();
insertSampleMapData(hashMap1);
System.out.println(hashMap1.getClass().getSimpleName());
new HashMapVisualiser(console).visualise(hashMap1);
System.out.println();
System.out.println();
}
private void insertSampleMapData(Map map){

private void insertSampleMapData(Map map) {
map.put("name", "Manoel Campos");
map.put("country", "Brazil");
map.put("country", "Brazil");
map.put("age", 35);
map.put("height", 1.8);
map.put("gender", 'M');
map.put("site", "http://github.com/manoelcampos");
map.put("site", "http://github.com/manoelcampos");
}
public static void main(String args[]){

public static void main(String args[]) {
new Sample();
}
}
28 changes: 10 additions & 18 deletions src/main/java/com/monotonic/map_visualiser/TreeMapVisualiser.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
import java.lang.reflect.Field;
import java.util.TreeMap;

public class TreeMapVisualiser
{
public class TreeMapVisualiser {
private static final boolean BLACK = true;
private static final boolean RED = false;

Expand All @@ -13,8 +12,7 @@ public class TreeMapVisualiser
private static final Field leftField;
private static final Field rightField;

static
{
static {
Type entry = new Type("java.util.TreeMap$Entry");
Type treeMap = new Type(TreeMap.class);

Expand All @@ -26,42 +24,36 @@ public class TreeMapVisualiser

private final Console console;

public TreeMapVisualiser(final Console console)
{
public TreeMapVisualiser(final Console console) {
this.console = console;
}

public void visualise(final TreeMap<?, ?> map)
{
public void visualise(final TreeMap<?, ?> map) {
console.printf("Size: %d, %n", map.size());

Object root = Type.get(rootField, map);

visualiseSubTree(root, 0);
}

private int visualiseSubTree(final Object node, int index)
{
private int visualiseSubTree(final Object node, int index) {
console.indent(index);
final boolean colour = (boolean) Type.get(colorField, node);
if (colour == RED)
{
if (colour == RED) {
console.red();
}

console.println(node);
console.resetColour();

return 1
+ visualiseBranch(node, index, leftField)
+ visualiseBranch(node, index, rightField);
+ visualiseBranch(node, index, leftField)
+ visualiseBranch(node, index, rightField);
}

private int visualiseBranch(final Object node, final int index, final Field field)
{
private int visualiseBranch(final Object node, final int index, final Field field) {
Object branch = Type.get(field, node);
if (branch != null)
{
if (branch != null) {
return visualiseSubTree(branch, index + 1);
}
return 0;
Expand Down
Loading