package example.data; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class TFKTest { public static void main(String[] args) { TFKTest test = new TFKTest(); test.test(); } /** * 计算两个集合交集 */ public void test() { Node root = new Node(); // 初始化两条目标数据 Path data = Path.sentenceToPath("b71b060decc045e09769044784588755"); NodeOperate.addNode(root, data); data = Path.sentenceToPath("bacbe8961a0145bb87c9c8ab5f494123"); NodeOperate.addNode(root, data); // 初始化第一颗树 for (int i = 0; i < 5; i++) { String sentence = makeCharacter(); Path path = Path.sentenceToPath(sentence); NodeOperate.addNode(root, path); } // 第二树中的一个节点 String sentence = "bacbe8961a0145bb87c9c8ab5f494123"; Path target = Path.sentenceToPath(sentence); // 交集结果存储在temp中 Node temp = new Node(); // 进行或者运行 andComputer(root, temp, target); System.err.println("test"); } public String makeCharacter() { String uuid = UUID.randomUUID().toString().replace("-", ""); System.err.println(uuid); return uuid; } public void andComputer(Node root, Node temp, Path path) { if (NodeOperate.existsNode(root, path)) { System.err.println(Path.pathToSentence(path) + ":exists"); NodeOperate.addNode(temp, path); } } public void orCOmputer(Node root, Path path) { } } class Node { char key; Node value; Map<Character, Node> pair; } class NodeOperate { public static void addNode(Node node, Path path) { if (node == null || path == null) { return; } if (contains(node, path)) { Node next = findNode(node, path); if (next != null) { updateNode(node); addNode(next, path.next); } } else { Node next = new Node(); saveNode(node, path, next); addNode(next, path.next); } } public static void addNode0(Node node, Path path) { if (node == null || path == null) { return; } if (contains(node, path)) { Node next = findNode(node, path); addNode(next, path.next); } else { Node next = new Node(); if (node.key != 'u0000') { updateNode(node); } saveNode(node, path, next); addNode(next, path.next); } } public static Node findNode(Node node, Path path) { if (node.key != 'u0000') { if (node.key == (path.word)) { return node.value; } } return node.pair.get(path.word); } public static boolean existsNode(Node node, Path path) { Path it = path; Node next = node; int i = 0; do { next = findNode(next, it); if (next != null) { it = it.next; i++; } else { return false; } } while (it != null); return i == 32; } public static void saveNode(Node node, Path path, Node next) { if (node.pair != null) { node.pair.put(path.word, next); } else { node.key = path.word; node.value = next; } } public static void updateNode(Node node) { if (node.pair == null) { node.pair = new HashMap<>(); } node.pair.put(node.key, node.value); node.key = 'u0000'; node.value = null; } public static boolean contains(Node node, Path path) { if (node.pair != null) { return node.pair.containsKey(path.word); } if (node.key != 'u0000') { return node.key == (path.word); } return false; } } /** * Linked list representation of Pattern Path and Input Path */ class Path extends ArrayList<String> { private static final long serialVersionUID = 1L; public char word; public Path next; public int length; /** * Constructor - class has public members */ private Path() { next = null; word = 'u0000'; length = 0; } /** * convert a sentence (a string consisting of words separated by single spaces) * into a Path * * @param sentence * sentence to convert * @return sentence in Path form */ public static Path sentenceToPath(String sentence) { sentence = sentence.trim(); return arrayToPath(sentence.toCharArray()); } /** * The inverse of sentenceToPath * * @param path * input path * @return sentence */ public static String pathToSentence(Path path) { StringBuilder result = new StringBuilder(32); for (Path p = path; p != null; p = p.next) { result.append(p.word); } return result.toString(); /* * if (path == null) return ""; else return * path.word+" "+pathToSentence(path.next); */ } /** * convert an array of strings to a Path * * @param array * array of strings * @return sequence of strings as Path */ private static Path arrayToPath(char[] array) { Path tail = null; Path head = null; for (int i = array.length - 1; i >= 0; i--) { head = new Path(); head.word = array[i]; head.next = tail; if (tail == null) head.length = 1; else head.length = tail.length + 1; tail = head; } return head; // return arrayToPath(array, 0); } /** * recursively convert an array to a Path * * @param array * array of strings * @param index * array index * @return Path form */ static Path arrayToPath(char[] array, int index) { if (index >= array.length) return null; else { Path newPath = new Path(); newPath.word = array[index]; newPath.next = arrayToPath(array, index + 1); if (newPath.next == null) newPath.length = 1; else newPath.length = newPath.next.length + 1; return newPath; } } /** * print a Path */ public String print() { String result = ""; for (Path p = this; p != null; p = p.next) { result += p.word + ","; } if (result.endsWith(",")) result = result.substring(0, result.length() - 1); return result; } @Override public String toString() { return this.print(); } }