Порядок при использовании scala.collection.Searching - PullRequest
1 голос
/ 03 апреля 2019

У меня есть массив [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.
Я понимаю, что мне нужно указать правило odering для этой коллекцииМассив [(Long, Q)], но сам не могу понять это.
Пожалуйста, помогите

1 Ответ

0 голосов
/ 03 апреля 2019

Подпись 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  
    
  • и если вам нужны значения, вы можете использовать карту, которая будет работать как словарь:

    val dictionary = Map(
       5L -> new Q(1,2),
       6L-> new Q(6,9),
       7L-> new Q(7,6)
    )
    

EDIT:

На самом деле, я заметил, что что-то подобное будет работать:

val dummy = new Q(0,0) //any instance of Q
myArray.search(6L-> dummy)(Ordering.by(_._1)).insertionPoint //1

Это работает, так как для поиска точки вставки Ordering используется и тест на равенство не выполняется.

...