使用scala.collection.Searching时的排序

时间:2019-04-03 12:31:52

标签: arrays scala search

我有一个[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规则,但是我自己也无法弄清楚。
请帮助

1 个答案:

答案 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的查找,并且没有执行相等性测试。