Last active
January 19, 2019 17:47
-
-
Save mirasrael/2eec4ca975a9ae75f5ea4c81d7f82685 to your computer and use it in GitHub Desktop.
Collections for Kotlin lesson
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| package education | |
| import java.util.* | |
| import kotlin.test.assertEquals | |
| import kotlin.test.assertFalse | |
| import kotlin.test.assertTrue | |
| /** | |
| * Date: 1/13/2019 | |
| * Time: 20:49 | |
| */ | |
| fun main() | |
| { | |
| val myList = MyList("bar", "baz", "bar") | |
| assertFalse(myList.isEmpty()) | |
| assertEquals(myList.size, 3) | |
| assertFalse(myList.contains("foo")) | |
| assertTrue(myList.contains("bar")) | |
| assertFalse(myList.containsAll(listOf("foo", "bar"))) | |
| assertTrue(myList.containsAll(listOf("bar", "baz"))) | |
| assertEquals(myList.indexOf("foo"), -1) | |
| assertEquals(myList.indexOf("bar"), 0) | |
| assertEquals(myList.lastIndexOf("foo"), -1) | |
| assertEquals(myList.lastIndexOf("bar"), 2) | |
| myList.addAll(2, listOf("owl", "bowl")) | |
| printList(myList) | |
| } | |
| class MyList<E>(vararg elements: E) : MutableList<E> { | |
| private var elements: Array<E> = Arrays.copyOf(elements, elements.size) | |
| private fun ensureCapacity(newSize: Int) { | |
| if (newSize > elements.size) | |
| elements = Arrays.copyOf(elements, Math.max(elements.size * 2, newSize)) | |
| } | |
| override fun add(element: E): Boolean { | |
| ensureCapacity(size + 1) | |
| elements[this.size] = element | |
| this.size++ | |
| return true | |
| } | |
| override fun add(index: Int, element: E) { | |
| if (index < 0 || index > this.size) | |
| throw IndexOutOfBoundsException() | |
| ensureCapacity(this.size + 1) | |
| if (index < this.size) { | |
| for (i in this.size - 1 downTo index) | |
| this.elements[i + 1] = this.elements[i] | |
| } | |
| this.elements[index] = element | |
| this.size++ | |
| } | |
| override fun addAll(index: Int, elements: Collection<E>): Boolean { | |
| if (index < 0 || index > this.size) | |
| throw IndexOutOfBoundsException() | |
| ensureCapacity(this.size + elements.size) | |
| if (index < this.size) { | |
| for (i in this.size - 1 downTo index) | |
| this.elements[i + elements.size] = this.elements[i] | |
| } | |
| var i = index | |
| for (e in elements) | |
| this.elements[i++] = e | |
| this.size += elements.size | |
| return true | |
| } | |
| override fun addAll(elements: Collection<E>): Boolean = addAll(this.size, elements) | |
| override fun clear() { | |
| this.size = 0 | |
| } | |
| override fun remove(element: E): Boolean { | |
| TODO("not implemented") //To change body of created functions use File | Settings | File Templates. | |
| } | |
| override fun removeAll(elements: Collection<E>): Boolean { | |
| TODO("not implemented") //To change body of created functions use File | Settings | File Templates. | |
| } | |
| override fun removeAt(index: Int): E { | |
| TODO("not implemented") //To change body of created functions use File | Settings | File Templates. | |
| } | |
| override fun retainAll(elements: Collection<E>): Boolean { | |
| TODO("not implemented") //To change body of created functions use File | Settings | File Templates. | |
| } | |
| override fun set(index: Int, element: E): E { | |
| val oldValue = elements[index] | |
| elements[index] = element | |
| return oldValue | |
| } | |
| override var size: Int = elements.size | |
| private set | |
| override fun contains(element: E): Boolean = indexOf(element) != -1 | |
| override fun containsAll(elements: Collection<E>): Boolean = elements.all { contains(it) } | |
| override fun get(index: Int): E = elements[index] | |
| override fun indexOf(element: E): Int = elements.indexOf(element) | |
| override fun isEmpty(): Boolean = size == 0 | |
| override fun iterator(): MutableIterator<E> = MyIterator(elements, size) | |
| override fun lastIndexOf(element: E): Int = elements.lastIndexOf(element) | |
| override fun listIterator(): MutableListIterator<E> = mutableListOf(*elements).listIterator() | |
| override fun listIterator(index: Int): MutableListIterator<E> = mutableListOf(*elements).listIterator(index) | |
| override fun subList(fromIndex: Int, toIndex: Int): MutableList<E> = mutableListOf(*elements).subList(fromIndex, toIndex) | |
| class MyIterator<E>(private val elements: Array<E>, private val size: Int) : MutableIterator<E> { | |
| override fun remove() { | |
| TODO("not implemented") | |
| } | |
| private var currentIndex = 0 | |
| override fun hasNext() = currentIndex < size | |
| override fun next(): E = elements[currentIndex++] | |
| } | |
| } | |
| fun <E> concat(list: MutableList<E>, otherList: List<E>) { | |
| for (el in otherList) | |
| list.add(el) | |
| } | |
| fun <E> printList(l: List<E>) | |
| { | |
| for (item in l) | |
| println(item) | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment