【发布时间】:2021-05-17 05:58:28
【问题描述】:
我需要对一组自定义案例类执行二进制搜索。这应该像调用scala.collection.Searching中定义的search函数一样简单:
如你所见,如果我调用搜索方法的集合是一个索引序列,则执行二分查找。
现在,我需要创建我的自定义 Ordering[B] 参数,并且我想将它显式传递给 search 函数(我不希望它采用任何从上下文推断的隐式参数)。
我有以下代码:
// File 1
case class Person(name: String, id: Int)
object Person{
val orderingById: Ordering[Person] = Ordering.by(e => e.id)
}
// File 2 (same package)
for(i <- orderedId.indices) {
// orderedId is an array of Int
// listings is an array of Person
val listingIndex = listings.search(orderedId(i))(Person.orderingById)
...
}
我收到以下错误:
类型不匹配。必需:Ordering[Any],找到:Ordering[Nothing]
所以,我尝试以这种方式更改实现:
// file 1
object Person{
implicit def orderingById[A <: Person] : Ordering[A] = {
Ordering.by(e => e.id)
}
}
//file 2 as before
这次出现如下错误:
类型不匹配。必填:Ordering[Any],找到:Ordering[Person]
为什么会这样?至少在第二种情况下,它应该从Any转换为Person吗?
【问题讨论】:
-
listing的类型是什么orderedId的类型是什么? -
Listing->Person、orderedId的数组 ->Int的数组。它被写成代码中的注释,但可能不够明显/可见。 -
您正在一组人员中搜索一个 int,这将永远无法工作。你想要这个:
listings.find(p => p.id == orderedId(i))并删除自定义排序,因为它不需要 - 另外,请不要使用 Arrays,也请不要使用命令式循环,还请查看Scaladoc。此外,如果您要不断地通过键搜索事物,最好将其转换为 Map-
标签: arrays scala sorting search implicit