From 6aa7075de97c566c76c46af27c6e151ae894701a Mon Sep 17 00:00:00 2001 From: norangebit Date: Wed, 10 Apr 2019 23:24:01 +0200 Subject: [PATCH] unordered dictionaries - add interface of dictionaries --- .../datastructures/dictionary/Dictionaries.kt | 44 +++++++++++ .../datastructures/dictionary/Map.kt | 76 +++++++++++++++++++ .../datastructures/dictionary/MapTest.kt | 70 +++++++++++++++++ 3 files changed, 190 insertions(+) create mode 100644 src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Dictionaries.kt create mode 100644 src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Map.kt create mode 100644 src/test/kotlin/it/norangeb/algorithms/datastructures/dictionary/MapTest.kt diff --git a/src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Dictionaries.kt b/src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Dictionaries.kt new file mode 100644 index 0000000..bc2bd0f --- /dev/null +++ b/src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Dictionaries.kt @@ -0,0 +1,44 @@ +/* + * MIT License + * + * Copyright (c) 2019 norangebit + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package it.norangeb.algorithms.datastructures.dictionary + +import arrow.core.Option + +interface Dictionary { + operator fun get(key: K): Option + operator fun set(key: K, value: V) + fun delete(key: K) + fun contains(key: K): Boolean + fun isEmpty(): Boolean + fun size(): Int +} + +interface OrderedDictionary, V> : Dictionary { + fun max(): K + fun min(): K + fun floor(key: K): K + fun ceiling(key: K): K +} diff --git a/src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Map.kt b/src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Map.kt new file mode 100644 index 0000000..060516d --- /dev/null +++ b/src/main/kotlin/it/norangeb/algorithms/datastructures/dictionary/Map.kt @@ -0,0 +1,76 @@ +/* + * MIT License + * + * Copyright (c) 2019 norangebit + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package it.norangeb.algorithms.datastructures.dictionary + +import arrow.core.None +import arrow.core.Option +import arrow.core.getOrElse +import arrow.core.toOption + +class Map : Dictionary { + private var size = 0 + private var head: Option> = None + + override fun get(key: K): Option = head.flatMap { node -> + node.find { elem.first == key } + .map { it.elem.second } + } + + override fun set(key: K, value: V) = head + .flatMap { it.find { elem.first == key } } + .fold( + { + size++ + val node = Node(Pair(key, value), head) + head = node.toOption() + }, + { it.elem = Pair(key, value) } + ) + + override fun delete(key: K) { + head.flatMap { + it.find { next.map { it.elem.first == key }.getOrElse { false } } + }.map { + size-- + it.next = it.next.flatMap { it.next } + } + } + + override fun contains(key: K): Boolean = get(key) != None + + override fun isEmpty(): Boolean = size == 0 + + override fun size(): Int = size + + data class Node(var elem: Pair, var next: Option>) { + fun find( + predicate: Node.() -> Boolean + ): Option> = when { + predicate(this) -> this.toOption() + else -> next.flatMap { it.find(predicate) } + } + } +} \ No newline at end of file diff --git a/src/test/kotlin/it/norangeb/algorithms/datastructures/dictionary/MapTest.kt b/src/test/kotlin/it/norangeb/algorithms/datastructures/dictionary/MapTest.kt new file mode 100644 index 0000000..bbca586 --- /dev/null +++ b/src/test/kotlin/it/norangeb/algorithms/datastructures/dictionary/MapTest.kt @@ -0,0 +1,70 @@ +/* + * MIT License + * + * Copyright (c) 2019 norangebit + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package it.norangeb.algorithms.datastructures.dictionary + +import arrow.core.None +import arrow.core.Some +import org.amshove.kluent.`should be equal to` +import org.amshove.kluent.`should be` +import org.amshove.kluent.should +import org.junit.Before +import org.junit.Test + +class MapTest { + lateinit var map: Dictionary + + @Before + fun init() { + map = Map() + } + + @Test + fun testMap() { + map.size() `should be equal to` 0 + map.contains("TRE") `should be` false + + map["TRE"] = 3 + map["UNO"] = 0 + + map["DUE"] `should be` None + map["TRE"] should { this == Some(3) } + + map["QUATTRO"] = 4 + map["UNO"] = 1 + map["DUE"] = 2 + + map.size() `should be equal to` 4 + map.contains("DUE") `should be` true + map["UNO"] should { this == Some(1) } + + map["CINQUE"] = 5 + map.delete("DUE") + map.delete("SEI") + + map.contains("DUE") `should be` false + map.size() `should be equal to` 4 + } +} \ No newline at end of file