From c023a02884fd18cd43ccb73fba5a80551091b6e0 Mon Sep 17 00:00:00 2001 From: "Valeriy.Vyrva" Date: Wed, 2 Oct 2019 17:52:05 +0300 Subject: [PATCH] Create SortedMap with Comparator and items KT-34142 --- .../stdlib/jvm/src/kotlin/collections/MapsJVM.kt | 12 ++++++++++++ libraries/stdlib/jvm/test/collections/MapJVMTest.kt | 9 +++++++++ .../stdlib/samples/test/samples/collections/maps.kt | 7 +++++++ .../kotlin-stdlib-runtime-merged.txt | 1 + 4 files changed, 29 insertions(+) diff --git a/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt b/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt index 10486f73467..e90e51fe57c 100644 --- a/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt +++ b/libraries/stdlib/jvm/src/kotlin/collections/MapsJVM.kt @@ -113,6 +113,18 @@ public fun Map.toSortedMap(comparator: Comparator): Sorte public fun , V> sortedMapOf(vararg pairs: Pair): SortedMap = TreeMap().apply { putAll(pairs) } +/** + * Returns a new [SortedMap] with the specified contents, given as a list of pairs + * where the first value is the key and the second is the value. + * + * The resulting [SortedMap] determines the equality and order of keys according to the sorting order provided by the given [comparator]. + * + * @sample samples.collections.Maps.Instantiation.sortedMapWithComparatorFromPairs + */ +@SinceKotlin("1.4") +public fun sortedMapOf(comparator: Comparator, vararg pairs: Pair): SortedMap = + TreeMap(comparator).apply { putAll(pairs) } + /** * Converts this [Map] to a [Properties] object. diff --git a/libraries/stdlib/jvm/test/collections/MapJVMTest.kt b/libraries/stdlib/jvm/test/collections/MapJVMTest.kt index 3156cd93197..c8274691512 100644 --- a/libraries/stdlib/jvm/test/collections/MapJVMTest.kt +++ b/libraries/stdlib/jvm/test/collections/MapJVMTest.kt @@ -18,6 +18,15 @@ class MapJVMTest { assertEquals(listOf("a", "b", "c"), map.keys.toList()) } + @Test fun createSortedMapWithComparator() { + val map = sortedMapOf(compareBy { it.length }.thenBy { it }, Pair("c", 3), Pair("bc", 2), Pair("bd", 4), Pair("abc", 1)) + assertEquals(1, map["abc"]) + assertEquals(2, map["bc"]) + assertEquals(3, map["c"]) + assertEquals(4, map["bd"]) + assertEquals(listOf("c", "bc", "bd", "abc"), map.keys.toList()) + } + @Test fun toSortedMap() { val map = mapOf(Pair("c", 3), Pair("b", 2), Pair("a", 1)) val sorted = map.toSortedMap() diff --git a/libraries/stdlib/samples/test/samples/collections/maps.kt b/libraries/stdlib/samples/test/samples/collections/maps.kt index 8141e18bc95..b0e4f3675c9 100644 --- a/libraries/stdlib/samples/test/samples/collections/maps.kt +++ b/libraries/stdlib/samples/test/samples/collections/maps.kt @@ -43,6 +43,13 @@ class Maps { assertPrints(map.values, "[2, 3, 1]") } + @Sample + fun sortedMapWithComparatorFromPairs() { + val map = sortedMapOf(compareBy { it.length }.thenBy { it }, Pair("abc", 1), Pair("c", 3), Pair("bd", 4), Pair("bc", 2)) + assertPrints(map.keys, "[c, bc, bd, abc]") + assertPrints(map.values, "[3, 2, 4, 1]") + } + @Sample fun emptyReadOnlyMap() { val map = emptyMap() diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 73a1b27a334..e2ccf47020d 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -2445,6 +2445,7 @@ public final class kotlin/collections/MapsKt { public static final fun putAll (Ljava/util/Map;Ljava/lang/Iterable;)V public static final fun putAll (Ljava/util/Map;Lkotlin/sequences/Sequence;)V public static final fun putAll (Ljava/util/Map;[Lkotlin/Pair;)V + public static final fun sortedMapOf (Ljava/util/Comparator;[Lkotlin/Pair;)Ljava/util/SortedMap; public static final fun sortedMapOf ([Lkotlin/Pair;)Ljava/util/SortedMap; public static final fun toList (Ljava/util/Map;)Ljava/util/List; public static final fun toMap (Ljava/lang/Iterable;)Ljava/util/Map;