Advertisement
Guest User

Untitled

a guest
Apr 1st, 2015
205
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.49 KB | None | 0 0
  1. public class Trie<Value> {
  2.  
  3. private class Node {
  4. private Value val;
  5. private TreeMap<Character, Node> children;
  6.  
  7. public Node() {
  8. val = null;
  9. children = new TreeMap<Character, Node>();
  10. }
  11. }
  12.  
  13. private Node root;
  14.  
  15. public Trie() {
  16. root = null;
  17. }
  18.  
  19. public boolean containsKey(String key) {
  20. Node node = getNode(key);
  21. if (node == null)
  22. return false;
  23. return node.val != null;
  24. }
  25.  
  26. public void put(String key, Value val) {
  27. root = put(root, key, val, 0);
  28. }
  29.  
  30. private Node put(Node node, String key, Value val, int index) {
  31. if (node == null)
  32. node = new Node();
  33. if (index == key.length()) {
  34. node.val = val;
  35. return node;
  36. }
  37. Node next = put(node.children.get(key.charAt(index)), key, val, index + 1);
  38. node.children.put(key.charAt(index), next);
  39. return node;
  40. }
  41.  
  42. public Value get(String key) {
  43. Node node = getNode(key);
  44. return node == null? null: node.val;
  45. }
  46.  
  47. private Node getNode(String key) {
  48. int len = key.length();
  49. Node node = root;
  50. for (int i = 0; i < len; i++) {
  51. if (node == null)
  52. return null;
  53. node = node.children.get(key.charAt(i));
  54. }
  55. return node;
  56. }
  57.  
  58. public void delete(String key) {
  59. root = delete(root, key, 0);
  60. }
  61.  
  62. private Node delete(Node node, String key, int len) {
  63. if (node == null)
  64. return null;
  65. if(key.length() == len) {
  66. //it key is not a word in trie
  67. if (node.val == null)
  68. return node;
  69. else {
  70. //if the node has children
  71. if (node.children.size() > 0) {
  72. node.val = null;
  73. return node;
  74. } else
  75. return null;
  76. }
  77. }
  78. Node next = delete(node.children.get(key.charAt(len)), key, len + 1);
  79. if (next == null) {
  80. //if word is not in the trie
  81. if (!node.children.containsKey(key.charAt(len)))
  82. return node;
  83. else {
  84. //if has more the one children or this node has value(it is a word in trie)
  85. if (node.children.size() > 1 || node.val != null) {
  86. node.children.remove(key.charAt(len));
  87. return node;
  88. } else
  89. return null;
  90. }
  91. } else
  92. return node;
  93. }
  94.  
  95. public Iterable<String> keys() {
  96. LinkedList<String> list = new LinkedList<String>();
  97. collect(root, list, "");
  98. return list;
  99. }
  100.  
  101. private void collect(Node node, LinkedList<String> list, String str) {
  102. if (node == null)
  103. return;
  104. if (node.val != null)
  105. list.add(new String(str));
  106. Iterator<Entry<Character, Node>> iter = node.children.entrySet().iterator();
  107. while (iter.hasNext()) {
  108. Entry<Character, Node> entry = iter.next();
  109. collect(entry.getValue(), list, str + entry.getKey());
  110. }
  111. }
  112.  
  113. public Iterable<String> keysWithPrefix(String prefix) {
  114. LinkedList<String> list = new LinkedList<String>();
  115. Node node = getNode(prefix);
  116. collect(node, list, prefix);
  117. return list;
  118. }
  119.  
  120. public String longestPrefixOf(String key) {
  121. int length = search(root, key, 0);
  122. return key.substring(0, length);
  123. }
  124.  
  125. private int search(Node node, String key, int len) {
  126. if (node == null)
  127. return len;
  128. if (key.length() == len)
  129. return len;
  130. Node next = node.children.get(key.charAt(len));
  131. if (next == null)
  132. return len;
  133. return search(next, key, len + 1);
  134.  
  135. }
  136.  
  137. public String longestKeyAsPrefixOf(String key) {
  138. int length = search(root, key, 0, 0);
  139. return key.substring(0, length);
  140. }
  141.  
  142. private int search(Node node, String key, int longestLen, int currLen) {
  143. if (node == null)
  144. return longestLen;
  145. if (node.val != null)
  146. longestLen = currLen;
  147. if (key.length() == currLen)
  148. return longestLen;
  149. Node next = node.children.get(key.charAt(currLen));
  150. return search(next, key, longestLen, currLen + 1);
  151. }
  152. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement