Advertisement
Guest User

Untitled

a guest
Jul 6th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.06 KB | None | 0 0
  1. class StringSearchTree private constructor(val key: Char, var isLeaf: Boolean,
  2.                                            val parent: StringSearchTree?) {
  3.    
  4.     private val children = mutableMapOf<Char, StringSearchTree>()
  5.    
  6.     constructor(): this('\u0000', false, null)
  7.    
  8.     fun add(value: String) {
  9.         assert(parent == null)
  10.         add(value, 0)
  11.     }
  12.    
  13.     private fun add(value: String, offset: Int) {
  14.         if (offset >= value.length) {
  15.             return
  16.         }
  17.         var subTree = children.get(value[offset])
  18.         if (subTree == null) {
  19.             subTree = StringSearchTree(value[offset], offset == (value.length - 1), this)
  20.             children.put(subTree.key, subTree)
  21.         }
  22.         if (offset == (value.length - 1)) {
  23.             subTree.isLeaf = true
  24.         } else {
  25.             subTree.add(value, offset + 1)
  26.         }
  27.     }
  28.    
  29.     fun remove(value: String) {
  30.         assert(parent == null)
  31.         remove(value, 0)
  32.     }
  33.    
  34.     private fun remove(value: String, offset: Int) {
  35.         if (offset >= value.length) {
  36.             return
  37.         }
  38.         val subTree = children.get(value[offset]) ?: return
  39.         if (offset == (value.length - 1)) {
  40.             subTree.isLeaf = false
  41.         } else {
  42.             subTree.remove(value, offset + 1)
  43.         }
  44.         if (subTree.children.isEmpty() && !subTree.isLeaf) {
  45.             children.remove(value[offset])
  46.         }
  47.     }
  48.    
  49.     fun search(value: Char): StringSearchTree? {
  50.         return children.get(value)
  51.     }
  52.    
  53.     fun reverseLookup(): String {
  54.         assert(parent != null)
  55.         val result = StringBuilder()
  56.         result.append(key)
  57.         var parent = parent
  58.         while (parent!!.parent != null) {
  59.             result.append(parent.key)
  60.             parent = parent.parent
  61.         }
  62.         return result.reversed().toString()
  63.     }
  64.    
  65.     class Search(var tree: StringSearchTree) {
  66.        
  67.         var finished = false
  68.             private set
  69.        
  70.         fun next(char: Char): Result {
  71.             assert(!finished)
  72.             val nextTree = tree.search(char)
  73.             if (nextTree == null) {
  74.                 finished = true;
  75.                 if (tree.isLeaf) {
  76.                     return Result.FOUND
  77.                 } else {
  78.                     return Result.NOT_FOUND
  79.                 }
  80.             } else {
  81.                 tree = nextTree
  82.                 return Result.NEED_MORE
  83.             }
  84.         }
  85.        
  86.         fun reset() {
  87.             finished = false
  88.         }
  89.        
  90.         enum class Result {
  91.             NEED_MORE,
  92.             FOUND,
  93.             NOT_FOUND
  94.         }
  95.        
  96.     }
  97.    
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement