Advertisement
Guest User

Untitled

a guest
May 15th, 2018
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 3.37 KB | None | 0 0
  1.  
  2. class SortedList<T>(
  3.         val idSupplierFunction: (element: T) -> Long,
  4.         val isDescendingOrder: Boolean = true
  5. ) {
  6.     val innerList = mutableListOf<T>()
  7.  
  8.     fun size(): Int {
  9.         return innerList.size
  10.     }
  11.  
  12.     fun clear() {
  13.         innerList.clear()
  14.     }
  15.  
  16.     operator fun get(index: Int): T {
  17.         return innerList[index]
  18.     }
  19.  
  20.     private fun getIndex(index: Int, elementId: Long): Int {
  21.         val currentElementId = idSupplierFunction(innerList[index])
  22.         val elementToLeft = innerList.getOrNull(index - 1)
  23.         val elementToRight = innerList.getOrNull(index + 1)
  24.  
  25.         if (elementToLeft == null && elementToRight == null) {
  26.             val insertToRight = elementId > currentElementId
  27.             return if (insertToRight) {
  28.                 index + 1
  29.             } else {
  30.                 0
  31.             }
  32.         }
  33.  
  34.         if (elementToLeft != null && elementToRight == null) {
  35.             val elementToLeftId = idSupplierFunction(elementToLeft)
  36.             if (elementId > currentElementId) {
  37.                 if (elementId > elementToLeftId) {
  38.                     return index + 1
  39.                 }
  40.             } else {
  41.                 return index
  42.             }
  43.         }
  44.  
  45.         if (elementToLeft == null && elementToRight != null) {
  46.             val elementToRightId = idSupplierFunction(elementToRight)
  47.             if (elementId < currentElementId) {
  48.                 return index
  49.             } else {
  50.                 if (elementId < elementToRightId) {
  51.                     return index + 1
  52.                 }
  53.             }
  54.         }
  55.  
  56.         if (elementToLeft != null && elementToRight != null) {
  57.             val elementToLeftId = idSupplierFunction(elementToLeft)
  58.             val elementToRightId = idSupplierFunction(elementToRight)
  59.  
  60.             if (elementId > currentElementId) {
  61.                 if (elementId < elementToRightId) {
  62.                     return index + 1
  63.                 }
  64.             } else if (elementId < currentElementId) {
  65.                 if (elementId > elementToLeftId) {
  66.                     return index
  67.                 }
  68.             }
  69.         }
  70.  
  71.         return -1
  72.     }
  73.  
  74.     private fun getIndexForNewElement(elementId: Long, indexLow: Int, indexHigh: Int): Int {
  75.         val index = (indexLow + indexHigh) / 2
  76.         if (index < 0 || index > innerList.size) {
  77.             throw IllegalStateException("Wut?")
  78.         }
  79.  
  80.         val newIndex = getIndex(index, elementId)
  81.         if (newIndex != -1) {
  82.             return newIndex
  83.         }
  84.  
  85.         return if (elementId > idSupplierFunction(innerList[index])) {
  86.             getIndexForNewElement(elementId, index + 1, indexHigh)
  87.         } else if (elementId < idSupplierFunction(innerList[index])) {
  88.             getIndexForNewElement(elementId, indexLow, index - 1)
  89.         } else {
  90.             if (isDescendingOrder) {
  91.                 index
  92.             } else {
  93.                 index + 1
  94.             }
  95.         }
  96.     }
  97.  
  98.     fun add(element: T): Int {
  99.         val elementId = idSupplierFunction(element)
  100.  
  101.         if (innerList.isEmpty()) {
  102.             innerList.add(element)
  103.             return 0
  104.         }
  105.  
  106.         val index = getIndexForNewElement(elementId, 0, innerList.lastIndex)
  107.         innerList.add(index, element)
  108.  
  109.         return index
  110.     }
  111.  
  112.     fun remove(index: Int): Boolean {
  113.         return true
  114.     }
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement