Advertisement
Guest User

Untitled

a guest
Sep 22nd, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 2.87 KB | None | 0 0
  1. class OddList<T>(private val originalList: List<T>) : List<T> {
  2.     override val size: Int
  3.         get() = originalList.count() / 2
  4.  
  5.     override fun contains(element: T): Boolean {
  6.         for (index in 1 until originalList.count() step 2) {
  7.             if (originalList[index] == element)
  8.                 return true
  9.         }
  10.         return false
  11.     }
  12.  
  13.     override fun containsAll(elements: Collection<T>): Boolean {
  14.         outer@ for (element in elements) {
  15.             for (index in 1 until originalList.count() step 2) {
  16.                 if (originalList[index] == element)
  17.                     continue@outer
  18.             }
  19.             return false
  20.         }
  21.         return true
  22.     }
  23.  
  24.     override fun get(index: Int): T = originalList[2 * index + 1]
  25.  
  26.     override fun indexOf(element: T): Int {
  27.         for (index in 1 until originalList.count() step 2) {
  28.             if (originalList[index] == element)
  29.                 return (index - 1) / 2
  30.         }
  31.         return -1
  32.     }
  33.  
  34.     override fun isEmpty(): Boolean = size == 0
  35.  
  36.     override fun iterator(): Iterator<T> = listIterator()
  37.  
  38.     override fun lastIndexOf(element: T): Int {
  39.         val start = originalList.count() - originalList.count() % 2 - 1
  40.         for (index in start downTo 0 step 2) {
  41.             if (originalList[index] == element)
  42.                 return (index - 1) / 2
  43.         }
  44.         return -1
  45.     }
  46.  
  47.     override fun listIterator(): ListIterator<T> = listIterator(0)
  48.  
  49.     override fun listIterator(index: Int): ListIterator<T> = object : ListIterator<T> {
  50.         var indexOddList = index
  51.  
  52.         override fun hasNext(): Boolean = indexOddList < size - 1
  53.  
  54.         override fun hasPrevious(): Boolean = indexOddList > 0
  55.  
  56.         override fun next(): T {
  57.             indexOddList += 1
  58.             return originalList[2 * indexOddList + 1]
  59.         }
  60.  
  61.         override fun nextIndex(): Int = indexOddList + 1
  62.  
  63.         override fun previous(): T {
  64.             indexOddList -= 1
  65.             return originalList[2 * indexOddList + 1]
  66.         }
  67.  
  68.         override fun previousIndex(): Int = indexOddList - 1
  69.     }
  70.  
  71.     override fun subList(fromIndex: Int, toIndex: Int): List<T> = originalList.subList(fromIndex * 2 + 1, toIndex * 2 + 1).filterIndexed {
  72.         index, _ -> index % 2 == 0
  73.     }
  74.  
  75.     override fun equals(other: Any?): Boolean {
  76.         if (other !is List<*> || other.count() != size) return false
  77.         for (index in 1 until originalList.count() step 2) {
  78.             if (originalList[index] != other[(index - 1) / 2])
  79.                 return false
  80.         }
  81.         return true
  82.     }
  83.  
  84.     override fun hashCode(): Int = originalList.asSequence().filterIndexed {
  85.         index, _ -> index % 2 == 1
  86.     }.hashCode()
  87. }
  88.  
  89. fun main() {
  90.     val originalList = listOf(0, 1, 2, 3, 4, 5)
  91.     val oddList = OddList(originalList)
  92.     println(oddList.joinToString())
  93. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement