我有一个[Long,Q]数组,想对它进行二进制搜索。我在下面尝试过:
import scala.collection.Searching._
class Q (val b:Double, val a:Double)
val myArray = Array(5L -> new Q(1,2), 6L-> new Q(6,9), 7L-> new Q(7,6))
val i = myArray.search(6L).insertionPoint
但出现此错误
没有为Any定义任何隐式排序
未指定值参数ord。
我知道我需要为此集合Array [(Long,Q)]指定一个odering规则,但是我自己也无法弄清楚。
请帮助
答案 0 :(得分:0)
search
的签名为search[B >: A](elem: B)(implicit ord: Ordering[B])
。您有一个类型为[Long, Q]
的数组。因此,为了使编译器正确推断Ordering
,您必须像这样调用搜索:
myArray.search(6L-> q/*Q(6,9)*/)(Ordering.by(_._1)) //ordering by the first value in a tuple.
,您正在做的是:myArray.search(6L)
。如果我正确理解您要执行的操作,则可能是在数组中找到值和位置。
您可以使用两个单独的数据结构来解决它:
键可以存储在数组中,如下所示:
val myArray = Array(5L, 6L, 7L).toList
myArray.search(6L).insertionPoint
,如果您需要值,则可以使用可用作字典的map:
val dictionary = Map(
5L -> new Q(1,2),
6L-> new Q(6,9),
7L-> new Q(7,6)
)
编辑:
实际上,我注意到类似的东西会起作用:
val dummy = new Q(0,0) //any instance of Q
myArray.search(6L-> dummy)(Ordering.by(_._1)).insertionPoint //1
之所以有效,是因为使用了插入点Ordering
的查找,并且没有执行相等性测试。