diff --git a/js/js.libraries/src/core/javautil.kt b/js/js.libraries/src/core/javautil.kt index ec7a32b9314..bc01dda3cca 100644 --- a/js/js.libraries/src/core/javautil.kt +++ b/js/js.libraries/src/core/javautil.kt @@ -8,7 +8,7 @@ private val DEFAULT_LOAD_FACTOR = 0.75f library public trait Comparator { - fun compare(obj1: T, obj2: T): Int; + public fun compare(obj1: T, obj2: T): Int; } library diff --git a/js/js.libraries/src/core/kotlin.kt b/js/js.libraries/src/core/kotlin.kt index e4178931e46..9f74e504776 100644 --- a/js/js.libraries/src/core/kotlin.kt +++ b/js/js.libraries/src/core/kotlin.kt @@ -2,9 +2,6 @@ package kotlin import java.util.* -library("comparator") -public fun comparator(f : (T, T) -> Int): Comparator = noImpl - library public fun array(vararg value : T): Array = noImpl diff --git a/js/js.translator/testData/kotlin_lib.js b/js/js.translator/testData/kotlin_lib.js index 9c63dbfdc22..4fb5bcc2d51 100644 --- a/js/js.translator/testData/kotlin_lib.js +++ b/js/js.translator/testData/kotlin_lib.js @@ -831,29 +831,6 @@ compare: throwAbstractFunctionInvocationError("Comparator#compare") }); - /** - * @class - * @implements {Kotlin.Comparator.} - * - * @constructor - * @param {function(T,T): Boolean} comparator - * @template T - */ - var ComparatorImpl = Kotlin.createClassNow(Kotlin.Comparator, - function (comparator) { - this.compare = comparator; - } - ); - - /** - * @param {function(T,T): Boolean} f - * @returns {Kotlin.Comparator.} - * @template T - */ - Kotlin.comparator = function (f) { - return new ComparatorImpl(f); - }; - Kotlin.collectionsMax = function (c, comp) { if (c.isEmpty()) { //TODO: which exception? diff --git a/libraries/stdlib/src/generated/_Ordering.kt b/libraries/stdlib/src/generated/_Ordering.kt index 5137f2d602a..a519de2ce81 100644 --- a/libraries/stdlib/src/generated/_Ordering.kt +++ b/libraries/stdlib/src/generated/_Ordering.kt @@ -136,7 +136,7 @@ public fun Iterable.sortBy(comparator: Comparator): List { */ public inline fun > Array.sortBy(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) order: (T) -> R): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -146,7 +146,7 @@ public inline fun > Array.sortBy(inlineOptions(Inlin */ public inline fun > Iterable.sortBy(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) order: (T) -> R): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -156,8 +156,7 @@ public inline fun > Iterable.sortBy(inlineOptions(Inline */ public fun > Iterable.sortDescending(): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> y.compareTo(x) } - java.util.Collections.sort(sortedList, sortBy) + java.util.Collections.sort(sortedList, comparator { x, y -> y.compareTo(x) }) return sortedList } @@ -166,7 +165,7 @@ public fun > Iterable.sortDescending(): List { */ public inline fun > Array.sortDescendingBy(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) order: (T) -> R): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(y).compareTo(order(x)) } + val sortBy: Comparator = compareByDescending(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -176,7 +175,7 @@ public inline fun > Array.sortDescendingBy(inlineOpt */ public inline fun > Iterable.sortDescendingBy(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) order: (T) -> R): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(y).compareTo(order(x)) } + val sortBy: Comparator = compareByDescending(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -285,7 +284,7 @@ public fun > Stream.toSortedList(): List { */ public fun > Array.toSortedListBy(order: (T) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -295,7 +294,7 @@ public fun > Array.toSortedListBy(order: (T) -> V): */ public fun > BooleanArray.toSortedListBy(order: (Boolean) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Boolean, y: Boolean) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -305,7 +304,7 @@ public fun > BooleanArray.toSortedListBy(order: (Boolean) -> V */ public fun > ByteArray.toSortedListBy(order: (Byte) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Byte, y: Byte) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -315,7 +314,7 @@ public fun > ByteArray.toSortedListBy(order: (Byte) -> V): Lis */ public fun > CharArray.toSortedListBy(order: (Char) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Char, y: Char) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -325,7 +324,7 @@ public fun > CharArray.toSortedListBy(order: (Char) -> V): Lis */ public fun > DoubleArray.toSortedListBy(order: (Double) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Double, y: Double) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -335,7 +334,7 @@ public fun > DoubleArray.toSortedListBy(order: (Double) -> V): */ public fun > FloatArray.toSortedListBy(order: (Float) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Float, y: Float) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -345,7 +344,7 @@ public fun > FloatArray.toSortedListBy(order: (Float) -> V): L */ public fun > IntArray.toSortedListBy(order: (Int) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Int, y: Int) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -355,7 +354,7 @@ public fun > IntArray.toSortedListBy(order: (Int) -> V): List< */ public fun > LongArray.toSortedListBy(order: (Long) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Long, y: Long) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -365,7 +364,7 @@ public fun > LongArray.toSortedListBy(order: (Long) -> V): Lis */ public fun > ShortArray.toSortedListBy(order: (Short) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: Short, y: Short) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -375,7 +374,7 @@ public fun > ShortArray.toSortedListBy(order: (Short) -> V): L */ public fun > Iterable.toSortedListBy(order: (T) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } @@ -385,7 +384,7 @@ public fun > Iterable.toSortedListBy(order: (T) -> V): L */ public fun > Stream.toSortedListBy(order: (T) -> V): List { val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList } diff --git a/libraries/stdlib/src/kotlin/Deprecated.kt b/libraries/stdlib/src/kotlin/Deprecated.kt index e3018d3766a..447b4dd0483 100644 --- a/libraries/stdlib/src/kotlin/Deprecated.kt +++ b/libraries/stdlib/src/kotlin/Deprecated.kt @@ -50,7 +50,6 @@ public fun Iterable.containsItem(item : T) : Boolean = contains(item) deprecated("Use sortBy() instead") public fun Iterable.sort(comparator: java.util.Comparator) : List = sortBy(comparator) - deprecated("Use size() instead") public val Array<*>.size: Int get() = size() @@ -77,3 +76,6 @@ public val DoubleArray.size: Int get() = size() deprecated("Use size() instead") public val BooleanArray.size: Int get() = size() + +deprecated("Use compareValuesBy() instead") +public fun compareBy(a: T?, b: T?, vararg functions: (T) -> Comparable<*>?): Int = compareValuesBy(a, b, *functions) diff --git a/libraries/stdlib/src/kotlin/Ordering.kt b/libraries/stdlib/src/kotlin/Ordering.kt index c380f18f1c0..d6265a5657f 100644 --- a/libraries/stdlib/src/kotlin/Ordering.kt +++ b/libraries/stdlib/src/kotlin/Ordering.kt @@ -16,18 +16,19 @@ package kotlin +import java.util.Comparator + /** - * Helper method for implementing [[Comparable]] methods using a list of functions - * to calculate the values to compare + * Compares two values using the sequence of functions to calculate a result of comparison. */ -public fun compareBy(a: T?, b: T?, vararg functions: T.() -> Comparable<*>?): Int { +public fun compareValuesBy(a: T?, b: T?, vararg functions: (T) -> Comparable<*>?): Int { require(functions.size > 0) if (a identityEquals b) return 0 - if (a == null) return - 1 + if (a == null) return -1 if (b == null) return 1 for (fn in functions) { - val v1 = a.fn() - val v2 = b.fn() + val v1 = fn(a) + val v2 = fn(b) val diff = compareValues(v1, v2) if (diff != 0) return diff } @@ -35,14 +36,92 @@ public fun compareBy(a: T?, b: T?, vararg functions: T.() -> Comparabl } /** - * Compares the two values which may be [[Comparable]] otherwise - * they are compared via [[#equals()]] and if they are not the same then - * the [[#hashCode()]] method is used as the difference + * Compares two [Comparable] nullable values, null is considered less than any value. */ public fun > compareValues(a: T?, b: T?): Int { if (a identityEquals b) return 0 - if (a == null) return - 1 + if (a == null) return -1 if (b == null) return 1 return (a as Comparable).compareTo(b) } + +/** + * Creates a comparator using the sequence of functions to calculate a result of comparison. + */ +public fun compareBy(vararg functions: (T) -> Comparable<*>?): Comparator { + return object : Comparator { + public override fun compare(a: T, b: T): Int = compareValuesBy(a, b, *functions) + } +} + +/** + * Creates a comparator using the sequence of functions to calculate a result of comparison. + */ +deprecated("Use compareBy() instead") +public fun comparator(vararg functions: (T) -> Comparable<*>?): Comparator = compareBy(*functions) + +/** + * Creates a comparator using the function to transform value to a [Comparable] instance for comparison + */ +inline public fun compareBy(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) comparable: (T) -> Comparable<*>): Comparator { + return object : Comparator { + public override fun compare(a: T, b: T): Int = compareValues(comparable(a), comparable(b)) + } +} + +/** + * Creates a descending comparator using the function to transform value to a [Comparable] instance for comparison + */ +inline public fun compareByDescending(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) comparable: (T) -> Comparable<*>): Comparator { + return object : Comparator { + public override fun compare(a: T, b: T): Int = compareValues(comparable(b), comparable(a)) + } +} + +/** + * Creates a comparator using the primary comparator and + * the function to transform value to a [Comparable] instance for comparison + */ +inline public fun Comparator.thenBy(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) comparable: (T) -> Comparable<*>): Comparator { + return object : Comparator { + public override fun compare(a: T, b: T): Int { + val previousCompare = this@thenBy.compare(a, b) + return if (previousCompare != 0) previousCompare else compareValues(comparable(a), comparable(b)) + } + } +} + +/** + * Creates a descending comparator using the primary comparator and + * the function to transform value to a [Comparable] instance for comparison + */ +inline public fun Comparator.thenByDescending(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) comparable: (T) -> Comparable<*>): Comparator { + return object : Comparator { + public override fun compare(a: T, b: T): Int { + val previousCompare = this@thenByDescending.compare(a, b) + return if (previousCompare != 0) previousCompare else compareValues(comparable(b), comparable(a)) + } + } +} + +/** + * Creates a comparator using the function to calculate a result of comparison. + */ +inline public fun comparator(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) comparison: (T, T) -> Int): Comparator { + return object : Comparator { + public override fun compare(a: T, b: T): Int = comparison(a, b) + } +} + +/** + * Creates a comparator using the primary comparator and function to calculate a result of comparison. + */ +inline public fun Comparator.thenComparator(inlineOptions(InlineOption.ONLY_LOCAL_RETURN) comparison: (T, T) -> Int): Comparator { + return object : Comparator { + public override fun compare(a: T, b: T): Int { + val previousCompare = this@thenComparator.compare(a, b) + return if (previousCompare != 0) previousCompare else comparison(a, b) + } + } +} \ No newline at end of file diff --git a/libraries/stdlib/src/kotlin/OrderingJVM.kt b/libraries/stdlib/src/kotlin/OrderingJVM.kt deleted file mode 100644 index 880e9b3673a..00000000000 --- a/libraries/stdlib/src/kotlin/OrderingJVM.kt +++ /dev/null @@ -1,51 +0,0 @@ -package kotlin - -import java.util.Comparator - -/** - * Creates a comparator using the sequence of functions used to calculate a value to compare on - */ -public fun comparator(vararg functions: T.() -> Comparable<*>?): Comparator { - return FunctionComparator(*functions) -} - - -private class FunctionComparator(private vararg val functions: T.() -> Comparable<*>?) : Comparator { - - public override fun toString(): String { - return "FunctionComparator${functions.toList()}" - } - - public override fun compare(o1: T, o2: T): Int { - return compareBy(o1, o2, *functions) - } - - public override fun equals(obj: Any?): Boolean { - return this == obj - } -} - -/** - * Creates a comparator using the sequence of functions used to calculate a value to compare on - */ -public fun comparator(fn: (T,T) -> Int): Comparator { - return Function2Comparator(fn) -} - -private class Function2Comparator(private val compareFn: (T, T) -> Int) : Comparator { - - public override fun toString(): String { - return "Function2Comparator${compareFn}" - } - - public override fun compare(a: T, b: T): Int { - if (a === b) return 0 - if (a == null) return -1 - if (b == null) return 1 - return (compareFn)(a, b) - } - - public override fun equals(obj: Any?): Boolean { - return this == obj - } -} diff --git a/libraries/stdlib/test/CompareJVMTest.kt b/libraries/stdlib/test/CompareJVMTest.kt deleted file mode 100644 index 057f990c6b4..00000000000 --- a/libraries/stdlib/test/CompareJVMTest.kt +++ /dev/null @@ -1,40 +0,0 @@ -package test.compare - -import java.util.Comparator -import kotlin.test.* -import org.junit.Test - -class CompareJVMTest { - val v1 = Item("wine", 9) - val v2 = Item("beer", 10) - - Test fun sortUsingComparatorHelperMethod() { - val c = comparator({ rating }, { name }) - println("Created comparator $c") - - val diff = c.compare(v1, v2) - assertTrue(diff < 0) - val items = arrayListOf(v1, v2) - items.sortBy(c) - println("Sorted list in rating order $items") - } - - Test fun sortUsingCustomComparator() { - val c = object : Comparator{ - override fun compare(o1: Item, o2: Item): Int { - return compareBy(o1, o2, { name }, { rating }) - } - override fun equals(obj: Any?): Boolean { - return this == obj - } - } - println("Created comparator $c") - - val diff = c.compare(v1, v2) - assertTrue(diff > 0) - val items = arrayListOf(v1, v2) - items.sortBy(c) - println("Sorted list in rating order $items") - } - -} diff --git a/libraries/stdlib/test/CompareTest.kt b/libraries/stdlib/test/CompareTest.kt deleted file mode 100644 index e517f869d61..00000000000 --- a/libraries/stdlib/test/CompareTest.kt +++ /dev/null @@ -1,37 +0,0 @@ -package test.compare - -import kotlin.test.* -import org.junit.Test - -class Item(val name: String, val rating: Int): Comparable { - override fun toString() = "Item($name, $rating)" - - public override fun compareTo(other: Item): Int { - return compareBy(this, other, { rating }, { name }) - } -} - -class CompareTest { - val v1 = Item("wine", 9) - val v2 = Item("beer", 10) - - Test fun compareByCompareTo() { - val diff = v1.compareTo(v2) - assertTrue(diff < 0) - } - - Test fun compareByNameFirst() { - val diff = compareBy(v1, v2, { name }, { rating }) - assertTrue(diff > 0) - } - - Test fun compareByRatingFirst() { - val diff = compareBy(v1, v2, { rating }, { name }) - assertTrue(diff < 0) - } - - Test fun compareSameObjectsByRatingFirst() { - val diff = compareBy(v1, v1, { rating }, { name }) - assertTrue(diff == 0) - } -} diff --git a/libraries/stdlib/test/OrderingTest.kt b/libraries/stdlib/test/OrderingTest.kt new file mode 100644 index 00000000000..4cf465f28ad --- /dev/null +++ b/libraries/stdlib/test/OrderingTest.kt @@ -0,0 +1,93 @@ +package test.compare + +import java.util.* +import kotlin.test.* +import org.junit.Test + +data class Item(val name: String, val rating: Int) : Comparable { + public override fun compareTo(other: Item): Int { + return compareValuesBy(this, other, { it.rating }, { it.name }) + } +} + +class OrderingTest { + val v1 = Item("wine", 9) + val v2 = Item("beer", 10) + + Test fun compareByCompareTo() { + val diff = v1.compareTo(v2) + assertTrue(diff < 0) + } + + Test fun compareByNameFirst() { + val diff = compareValuesBy(v1, v2, { it.name }, { it.rating }) + assertTrue(diff > 0) + } + + Test fun compareByRatingFirst() { + val diff = compareValuesBy(v1, v2, { it.rating }, { it.name }) + assertTrue(diff < 0) + } + + Test fun compareSameObjectsByRatingFirst() { + val diff = compareValuesBy(v1, v1, { it.rating }, { it.name }) + assertTrue(diff == 0) + } + + Test fun sortComparatorThenComparator() { + val comparator = comparator {(a, b) -> a.name.compareTo(b.name) } thenComparator {(a, b) -> a.rating.compareTo(b.rating) } + + val diff = comparator.compare(v1, v2) + assertTrue(diff > 0) + val items = arrayListOf(v1, v2).sortBy(comparator) + assertEquals(v2, items[0]) + assertEquals(v1, items[1]) + } + + Test fun sortByThenBy() { + val comparator = compareBy { it.rating } thenBy { it.name } + + val diff = comparator.compare(v1, v2) + assertTrue(diff < 0) + val items = arrayListOf(v1, v2).sortBy(comparator) + assertEquals(v1, items[0]) + assertEquals(v2, items[1]) + } + + Test fun sortByThenByDescending() { + val comparator = compareBy { it.rating } thenByDescending { it.name } + + val diff = comparator.compare(v1, v2) + assertTrue(diff < 0) + val items = arrayListOf(v1, v2).sortBy(comparator) + assertEquals(v1, items[0]) + assertEquals(v2, items[1]) + } + + Test fun sortUsingFunctionalComparator() { + val comparator = compareBy({ it.name }, { it.rating }) + val diff = comparator.compare(v1, v2) + assertTrue(diff > 0) + val items = arrayListOf(v1, v2).sortBy(comparator) + assertEquals(v2, items[0]) + assertEquals(v1, items[1]) + } + + Test fun sortUsingCustomComparator() { + val comparator = object : Comparator { + override fun compare(o1: Item, o2: Item): Int { + return compareValuesBy(o1, o2, { it.name }, { it.rating }) + } + + override fun equals(other: Any?): Boolean { + return this == other + } + } + val diff = comparator.compare(v1, v2) + assertTrue(diff > 0) + val items = arrayListOf(v1, v2).sortBy(comparator) + assertEquals(v2, items[0]) + assertEquals(v1, items[1]) + } + +} diff --git a/libraries/stdlib/test/collections/MapJVMTest.kt b/libraries/stdlib/test/collections/MapJVMTest.kt index 6680456a3f1..25cf51f1d3f 100644 --- a/libraries/stdlib/test/collections/MapJVMTest.kt +++ b/libraries/stdlib/test/collections/MapJVMTest.kt @@ -23,11 +23,7 @@ class MapJVMTest { test fun toSortedMapWithComparator() { val map = mapOf(Pair("c", 3), Pair("bc", 2), Pair("bd", 4), Pair("abc", 1)) - val c = comparator{ a, b -> - val answer = a.length() - b.length() - if (answer == 0) a.compareTo(b) else answer - } - val sorted = map.toSortedMap(c) + val sorted = map.toSortedMap(compareBy { it.length() } thenBy { it }) assertEquals(arrayListOf("c", "bc", "bd", "abc"), sorted.keySet().toList()) assertEquals(1, sorted["abc"]) assertEquals(2, sorted["bc"]) diff --git a/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt b/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt index 7383122fa87..1829a080fca 100644 --- a/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt +++ b/libraries/tools/kdoc/src/main/kotlin/org/jetbrains/kotlin/doc/KDocConfig.kt @@ -114,7 +114,7 @@ class KDocConfig() { private object LongestFirstStringComparator : Comparator { override fun compare(o1: String, o2: String): Int { - return compareBy(o1, o2, { length() }, { this }) + return compareValuesBy(o1, o2, { it.length() }, { it }) } override fun equals(other: Any?): Boolean { diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Ordering.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Ordering.kt index 89e8e9aac7e..5180a24e8f9 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Ordering.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Ordering.kt @@ -80,8 +80,7 @@ fun ordering(): List { body { """ val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> y.compareTo(x) } - java.util.Collections.sort(sortedList, sortBy) + java.util.Collections.sort(sortedList, comparator { x, y -> y.compareTo(x) }) return sortedList """ } @@ -105,7 +104,7 @@ fun ordering(): List { body { """ val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList """ @@ -128,7 +127,7 @@ fun ordering(): List { body { """ val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(x).compareTo(order(y)) } + val sortBy: Comparator = compareBy(order) java.util.Collections.sort(sortedList, sortBy) return sortedList """ @@ -150,7 +149,7 @@ fun ordering(): List { body { """ val sortedList = toArrayList() - val sortBy: Comparator = comparator {(x: T, y: T) -> order(y).compareTo(order(x)) } + val sortBy: Comparator = compareByDescending(order) java.util.Collections.sort(sortedList, sortBy) return sortedList """