关于Kotlin列表的binarySearch()
我在当地的Android Studio中运行了官方Kotlin文档中的示例,发现结果与我预期的不同,但我不知道是什么原因导致了这种情况关于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
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