Merge pull request #2341

* enableRandomEncryptSeed

* update config version

* Merge branch 'Grasscutters:development' into random-seed

* make the codes more beautiful

* move KahnsSort to algorithms

* rename variables

* Merge branch 'development' into random-seed
This commit is contained in:
Simplxs
2023-09-17 05:38:39 +08:00
committed by GitHub
Unverified
parent b8f7aea168
commit fb0c2dbc84
9 changed files with 118 additions and 30 deletions
@@ -1,64 +0,0 @@
package emu.grasscutter.utils.objects;
import java.util.*;
public class KahnsSort {
public static class Node {
int source, dest; // Dest is a value, and source too
public Node(int source, int dest) {
this.source = source;
this.dest = dest;
}
}
public static class Graph {
Map<Integer, List<Integer>> mainList;
Map<Integer, Integer> degreeList;
List<Integer> nodeList;
public Graph(List<Node> nodes, List<Integer> nodeList) {
mainList = new HashMap<>();
this.nodeList = nodeList;
for (int i = 0; i < nodeList.size(); i++) mainList.put(nodeList.get(i), new ArrayList<>());
degreeList = new HashMap<>();
for (int i = 0; i < nodeList.size(); i++) degreeList.put(nodeList.get(i), 0);
for (Node node : nodes) {
mainList.get(node.source).add(node.dest);
degreeList.replace(node.dest, degreeList.get(node.dest) + 1);
}
}
}
public static List<Integer> doSort(Graph graph) {
List<Integer> orderedList = new ArrayList<>();
Map<Integer, Integer> degreeList = graph.degreeList;
Stack<Integer> zeroStack = new Stack<>();
degreeList.forEach(
(key, value) -> {
if (value == 0) zeroStack.add(key);
});
while (!zeroStack.isEmpty()) {
int element = zeroStack.pop();
// If the list is empty then this node
if (!graph.mainList.get(element).isEmpty()) orderedList.add(element);
for (int topElement : graph.mainList.get(element)) {
degreeList.replace(topElement, degreeList.get(topElement) - 1);
if (degreeList.get(topElement) == 0) zeroStack.add(topElement);
}
}
if (degreeList.values().stream().filter(value -> value != 0).count() != 0)
return null; // Loop found
return orderedList;
}
}