Skip to content

Instantly share code, notes, and snippets.

@hd42
Last active May 20, 2016 16:33
Show Gist options
  • Save hd42/99be46676380b01e9dddb255e8283d6e to your computer and use it in GitHub Desktop.
Save hd42/99be46676380b01e9dddb255e8283d6e to your computer and use it in GitHub Desktop.
package software.schwering.javacodechallenge;
import static java.util.stream.Collectors.counting;
import static java.util.stream.Collectors.groupingBy;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.TreeMap;
import java.util.stream.Stream;
public class NodeDegrees extends TreeMap<Integer, Long> {
private static final long serialVersionUID = 1L;
public NodeDegrees(Path inputFile) throws IOException {
this(Files.lines(inputFile).skip(1));
}
public NodeDegrees(Stream<String> input) {
putAll(input.map(s -> s.split(" "))
.flatMap(s -> Stream.of(s))
.collect(groupingBy(Integer::new, counting())));
}
public static void main(String... args) throws IOException {
new NodeDegrees(Paths.get(args[0]))
.forEach((node, degree)-> System.out.format("Node %d has a degree of %d\n", node, degree));
}
}
package software.schwering.javacodechallenge;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.stream.Stream;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.Matcher;
import org.junit.Test;
public class NodeDegreesTest {
@Test
public void noDegreesForEmptyInput() {
Stream<String> input = Stream.of();
NodeDegrees nodeDegrees = new NodeDegrees(input);
assertThat(nodeDegrees.size(), is(0));
}
@Test
public void twoDegreesOf1forOneEdge() {
Stream<String> input = Stream.of("1 2");
NodeDegrees nodeDegrees = new NodeDegrees(input);
assertThat(nodeDegrees.size(), is(2));
assertThat(nodeDegrees.get(1), hasDegreeOf(1));
assertThat(nodeDegrees.get(2), hasDegreeOf(1));
}
@Test
public void incomingAndOutgoringEdgeIsCounted() {
Stream<String> input = Stream.of("1 2", "2 3");
NodeDegrees nodeDegrees = new NodeDegrees(input);
assertThat(nodeDegrees.size(), is(3));
assertThat(nodeDegrees.get(1), hasDegreeOf(1));
assertThat(nodeDegrees.get(2), hasDegreeOf(2));
assertThat(nodeDegrees.get(3), hasDegreeOf(1));
}
@Test
public void example() {
Stream<String> input = Stream.of("1 2", "1 3", "2 3", "1 4", "3 4", "1 5", "2 5", "1 6", "2 6", "3 6", "3 7",
"5 7", "6 7", "3 8", "4 8", "6 8", "7 8", "2 9", "5 9", "6 9", "2 10", "9 10", "6 11", "7 11", "8 11",
"9 11", "10 11", "1 12", "6 12", "7 12", "8 12", "11 12", "6 13", "7 13", "9 13", "10 13", "11 13",
"5 14", "8 14", "12 14", "13 14", "1 15", "2 15", "5 15", "9 15", "10 15", "11 15", "12 15", "13 15",
"1 16", "2 16", "5 16", "6 16", "11 16", "12 16", "13 16", "14 16", "15 16");
NodeDegrees nodeDegrees = new NodeDegrees(input);
assertThat(nodeDegrees.size(), is(16));
assertThat(nodeDegrees.get(1), hasDegreeOf(8));
assertThat(nodeDegrees.get(2), hasDegreeOf(8));
assertThat(nodeDegrees.get(3), hasDegreeOf(6));
assertThat(nodeDegrees.get(4), hasDegreeOf(3));
assertThat(nodeDegrees.get(5), hasDegreeOf(7));
assertThat(nodeDegrees.get(6), hasDegreeOf(10));
assertThat(nodeDegrees.get(7), hasDegreeOf(7));
assertThat(nodeDegrees.get(8), hasDegreeOf(7));
assertThat(nodeDegrees.get(9), hasDegreeOf(7));
assertThat(nodeDegrees.get(10), hasDegreeOf(5));
assertThat(nodeDegrees.get(11), hasDegreeOf(9));
assertThat(nodeDegrees.get(12), hasDegreeOf(8));
assertThat(nodeDegrees.get(13), hasDegreeOf(8));
assertThat(nodeDegrees.get(14), hasDegreeOf(5));
assertThat(nodeDegrees.get(15), hasDegreeOf(9));
assertThat(nodeDegrees.get(16), hasDegreeOf(9));
}
@Test
public void exampleStringFormat() throws IOException {
ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
PrintStream out = new PrintStream(byteStream);
System.setOut(out);
NodeDegrees.main("in.txt");
assertEquals("Node 1 has a degree of 8\n" + "Node 2 has a degree of 8\n" + "Node 3 has a degree of 6\n"
+ "Node 4 has a degree of 3\n" + "Node 5 has a degree of 7\n" + "Node 6 has a degree of 10\n"
+ "Node 7 has a degree of 7\n" + "Node 8 has a degree of 7\n" + "Node 9 has a degree of 7\n"
+ "Node 10 has a degree of 5\n" + "Node 11 has a degree of 9\n" + "Node 12 has a degree of 8\n"
+ "Node 13 has a degree of 8\n" + "Node 14 has a degree of 5\n" + "Node 15 has a degree of 9\n"
+ "Node 16 has a degree of 9\n", byteStream.toString());
}
private static Matcher<Long> hasDegreeOf(long degree) {
return new BaseMatcher<Long>() {
@Override
public boolean matches(Object item) {
return Long.valueOf(degree).equals(item);
}
@Override
public void describeTo(Description description) {
description.appendText("the node should have a degree of").appendValue(degree);
}
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment