Поиск обеспечивает бинарный поиск, но вам нужна индексированная последовательность, а не линейная (т. Е. List
), как объяснили другие, в противном случае вы все равно можете использовать search
, но вы получите линейный O(n) поведение, а не O (Log n).
Вы говорите, что хотите искать по имени, поэтому вам нужно отсортировать по имени, иначе ваши результаты могут быть противоречивыми.Вы должны исследовать scala.math.Ordering
Так что если вы можете преобразовать свой список в массив, вы можете сделать это.
case class Employee (id: Int, name : String, age : Int)
val emp1 = Employee(1, "Jane Doe", 45)
val emp2 = Employee(2, "Jon Doe", 54)
val emp3 = Employee(3, "Tera Patrick", 38)
val emp4 = Employee(4, "Jenna Jameson", 36)
// convert to an array
val employees = List(emp1, emp2, emp3, emp4).toArray
// define your ordering
import scala.math.Ordering
implicit object NameOrdering extends Ordering[Employee] {
def compare(a:Employee, b:Employee) = a.name compare b.name
}
// now sort
import scala.util.Sorting
Sorting.quickSort(employees)(NameOrdering)
И затем.
import scala.collection.Searching._
// If the element is found its index is returned
scala> val result = employees.search(emp3)
result: collection.Searching.SearchResult = Found(3)
Вдля извлечения элемента используйте метод insertionPoint
для результата.
scala> employees(result.insertionPoint)
res6: Employee = Employee(3,Tera Patrick,38)
Если элемент не найден, возвращается индекс его точки вставки в отсортированной последовательности.
val emp5 = Employee(5, "Aurora Snow", 34) // not added
scala> employees.search(emp5)
res2: collection.Searching.SearchResult = InsertionPoint(0)