Skip to content

Commit 443c93d

Browse files
committed
Added GrokkingTopSort practice file.
1 parent 062af3e commit 443c93d

File tree

1 file changed

+93
-0
lines changed

1 file changed

+93
-0
lines changed

GrokkingTopSort.java

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.cunningdj.grokJava;
2+
3+
import java.util.HashMap;
4+
import java.util.List;
5+
import java.util.ArrayList;
6+
import java.util.Stack;
7+
8+
class GrokkingTopSort {
9+
public static void main(String[] args) {
10+
Tester tester = new Tester();
11+
String testTitle="";
12+
13+
// CLASSES_ORDER
14+
testTitle = "CLASSES_ORDER";
15+
ClassDependencyPair pair1 = new ClassDependencyPair(1, 2);
16+
ClassDependencyPair pair2 = new ClassDependencyPair(2,3);
17+
ClassDependencyPair pair3 = new ClassDependencyPair(3,4);
18+
ClassDependencyPair pair4 = new ClassDependencyPair(1,4);
19+
ClassDependencyPair circularPair = new ClassDependencyPair(4,2);
20+
ClassDependencyPair[] pairs = {pair1, pair2, pair3, pair4};
21+
tester.testIntArrayEquals(new int[]{1,2,3,4}, classesOrder(4, pairs), testTitle);
22+
ClassDependencyPair[] pairs2 = {pair1, pair2, pair3, pair4, circularPair};
23+
tester.testIntArrayEquals(null, classesOrder(5, pairs2), testTitle);
24+
25+
}
26+
27+
public static int[] classesOrder(int numberOfClasses, ClassDependencyPair[] pairs) {
28+
HashMap<Integer, List<Integer>> parentChildrenMap = new HashMap<>();
29+
HashMap<Integer, Integer> inDegrees = new HashMap<>();
30+
for (ClassDependencyPair pair : pairs) {
31+
// Updating parent's children
32+
if (!parentChildrenMap.containsKey(pair.parent)) {
33+
parentChildrenMap.put(pair.parent, new ArrayList<Integer>());
34+
}
35+
parentChildrenMap.get(pair.parent).add(pair.child);
36+
37+
// Updating child's in-degrees
38+
if (!inDegrees.containsKey(pair.child)) {
39+
inDegrees.put(pair.child, 0);
40+
}
41+
inDegrees.put(pair.child, inDegrees.get(pair.child) + 1);
42+
}
43+
44+
Stack<Integer> noDependencies = new Stack<>();
45+
for (Integer node : parentChildrenMap.keySet()) {
46+
if (!inDegrees.containsKey(node)) {
47+
noDependencies.push(node);
48+
}
49+
}
50+
51+
int[] classesOrder = new int[numberOfClasses];
52+
int addi = 0;
53+
54+
Integer node = null;
55+
while (noDependencies.size() > 0) {
56+
node = noDependencies.pop();
57+
classesOrder[addi] = node;
58+
addi++;
59+
if (parentChildrenMap.containsKey(node)) {
60+
for (Integer child : parentChildrenMap.get(node)) {
61+
if (inDegrees.get(child) > 1) {
62+
inDegrees.put(child, inDegrees.get(child) - 1);
63+
} else {
64+
inDegrees.remove(child);
65+
}
66+
if (!inDegrees.containsKey(child)) {
67+
noDependencies.push(child);
68+
}
69+
}
70+
}
71+
}
72+
73+
if (addi < numberOfClasses-1) {
74+
return null;
75+
} else {
76+
return classesOrder;
77+
}
78+
}
79+
80+
static class ClassDependencyPair {
81+
public int parent;
82+
public int child;
83+
84+
public ClassDependencyPair(int parent, int child) {
85+
this.parent = parent;
86+
this.child = child;
87+
}
88+
89+
public String toString() {
90+
return String.valueOf(this.parent) + "-" + String.valueOf(this.child);
91+
}
92+
}
93+
}

0 commit comments

Comments
 (0)