From d8b3b3c5e4441cecec98c06a36fc81570008c888 Mon Sep 17 00:00:00 2001 From: bculkin2442 Date: Tue, 26 Jan 2016 11:32:41 -0500 Subject: Updates to various things, and addition of a graph class. --- .../main/java/bjc/utils/graph/AdjacencyMap.java | 100 +++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 BJC-Utils2/src/main/java/bjc/utils/graph/AdjacencyMap.java (limited to 'BJC-Utils2/src/main/java/bjc/utils/graph/AdjacencyMap.java') diff --git a/BJC-Utils2/src/main/java/bjc/utils/graph/AdjacencyMap.java b/BJC-Utils2/src/main/java/bjc/utils/graph/AdjacencyMap.java new file mode 100644 index 0000000..7a79233 --- /dev/null +++ b/BJC-Utils2/src/main/java/bjc/utils/graph/AdjacencyMap.java @@ -0,0 +1,100 @@ +package bjc.utils.graph; + +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; +import java.util.stream.IntStream; + +public class AdjacencyMap { + private Map> adjMap; + + public AdjacencyMap(Set vertices) { + vertices.forEach(src -> { + Map srcRow = new HashMap<>(); + + vertices.forEach(tgt -> srcRow.put(tgt, 0)); + + adjMap.put(src, srcRow); + }); + } + + public boolean isDirected() { + GenHolder res = new GenHolder<>(true); + + adjMap.entrySet() + .forEach(src -> src.getValue().entrySet().forEach(tgt -> { + int lhs = tgt.getValue(); + int rhs = adjMap.get(tgt.getKey()).get(src.getKey()); + + if (lhs != rhs) { + res.held = false; + } + })); + + return res.held; + } + + public void setWeight(T src, T tgt, int weight) { + adjMap.get(src).put(tgt, weight); + } + + public Graph toGraph() { + Graph ret = new Graph<>(); + + adjMap.entrySet() + .forEach(src -> src.getValue().entrySet() + .forEach(tgt -> ret.addEdge(src.getKey(), + tgt.getKey(), tgt.getValue()))); + + return ret; + } + + public static AdjacencyMap fromStream(InputStream stream) { + Scanner scn = new Scanner(stream); + scn.useDelimiter("\n"); + + // First, read in number of vertices + int numVertices = Integer.parseInt(scn.next()); + + Set vertices = new HashSet<>(); + IntStream.range(0, numVertices).forEach(e -> vertices.add(e)); + + // Create the adjacency map + AdjacencyMap aMap = new AdjacencyMap<>(vertices); + + GenHolder row = new GenHolder<>(0); + + scn.forEachRemaining((strang) -> { + String[] parts = strang.split(" "); + int col = 0; + + for (String part : parts) { + aMap.setWeight(row.held, col, Integer.parseInt(part)); + + col++; + } + + row.held++; + }); + + scn.close(); + + return aMap; + } + + public void toStream(OutputStream os) { + PrintStream ps = new PrintStream(os); + + adjMap.entrySet().forEach(src -> { + src.getValue().entrySet() + .forEach(tgt -> ps.printf("%d ", tgt.getValue())); + ps.println(); + }); + ps.close(); + } +} -- cgit v1.2.3