关于Kotlin列表的binarySearch()

关于Kotlin列表的binarySearch(),kotlin,Kotlin,我在当地的Android Studio中运行了官方Kotlin文档中的示例,发现结果与我预期的不同,但我不知道是什么原因导致了这种情况 data class Produce( val name: String, val price: Double ) 这是我定义的数据类 val list2 = listOf( Produce("AppCode", 52.0), Produce("IDEA", 1

我在当地的Android Studio中运行了官方Kotlin文档中的示例,发现结果与我预期的不同,但我不知道是什么原因导致了这种情况

    data class Produce(
    val name: String,
    val price: Double
)
这是我定义的数据类


 val list2 = listOf(
        Produce("AppCode", 52.0),
        Produce("IDEA", 182.0),
        Produce("VSCode", 2.75),
        Produce("Eclipse", 1.75)
    )
这是我的源代码列表


 println(list2.sortedWith(compareBy<Produce> {
        it.price
    }.thenBy {
        it.name
    }))
我这样调用
binarySearch()

println("result: ${
        list2.binarySearch(
            Produce("AppCode", 52.0), compareBy<Produce> {
                it.price
            }.thenBy {
                it.name
            }
        )
    }")

我不知道为什么会变成这样。请帮帮我。非常感谢

sortedWith()
不会修改列表,它会返回一个新的已排序集合。调用
list2.binarySearch()
时,您仍然可以搜索原始的未排序列表

您需要执行以下操作之一:

list2.sortedWith().binarySearch()

或者使用
mutableListOf()
创建列表,然后使用排序到位的
sort()

Broot是正确的。您需要将排序后的列表传递给
binarySearch()
函数。要在代码中澄清:

val comparator = compareBy<Produce> { it.price }.thenBy { it.name }
val sorted = list2.sortedWith(comparator)
println(sorted.joinToString("\n"))
val foundIndex = sorted.binarySearch(Produce("AppCode", 52.0), comparator)
println("Found at: $foundIndex")

首先谢谢你的回答。在kotlin中,binarySearch()可以使用comparator作为其参数。在上面的打印文本中,我只是观察排序列表。是的,您可以提供一个比较器,用于
binarySaerch()
,但这并不意味着它将使用这个比较器进行排序。提供它是为了告诉
binarySearch()
已应用于集合的排序算法是什么。文档说:“列表应该按照指定的比较器按升序排序,否则结果是未定义的。”。这是预期的,这意味着
binarySearch()
要求集合已经使用提供的comparator进行了排序。您提供了未排序的集合,因此您获得了上述未定义的行为。非常感谢您的帮助,我想我完全理解此函数的功能。非常感谢您的帮助,通过您的代码,我可以清楚地理解此函数的作用。
list2.sortedWith().binarySearch()
val comparator = compareBy<Produce> { it.price }.thenBy { it.name }
val sorted = list2.sortedWith(comparator)
println(sorted.joinToString("\n"))
val foundIndex = sorted.binarySearch(Produce("AppCode", 52.0), comparator)
println("Found at: $foundIndex")
Produce(name=Eclipse, price=1.75)
Produce(name=VSCode, price=2.75)
Produce(name=AppCode, price=52.0)
Produce(name=IDEA, price=182.0)
Found at: 2