binary_search_by возвращает странный индекс при использовании пользовательской структуры - PullRequest
0 голосов
/ 12 мая 2019

Моя функция get_index должна возвращать индекс заявленного элемента

pub const INVALID_INDEX: usize = <usize>::max_value();
pub fn get_index(&mut self, element: T) -> usize
where
    T: std::cmp::Ord,
{
    if self.data.is_empty() {
        return 0;
    }

    match self.data.binary_search_by(|probe| probe.cmp(&element)) {
        Ok(pos) => return pos,
        Err(pos) => return INVALID_INDEX,
    }
}

Чтобы предоставить тест, я создаю значение и некоторые фиктивные данные:

let mut list: List<FooModel> = List::new();

let my_foo_1 = FooModel {name: "John".to_string(), id_num: 10};
let my_foo_2 = FooModel {name: "Bill".to_string(), id_num: 20};

list.add(my_foo_1.clone());
list.add(my_foo_2.clone());
list.add(my_foo_3.clone());   
list.add(my_foo_4.clone()); 
list.add(my_foo_5.clone());  

проблема возникает, когда я пытаюсь получить индекс для первого элемента

println!("Element is at index {:?}",list.get_index(my_foo_1.clone()));

Я получаю значение INVALID_INDEX, возвращаемое для my_foo_1;все остальные выражения возвращают правильное значение индекса.

Если я создаю список с некоторыми общими типами:

let mut list_2: List<u32> = List::new();
list_2.add(1);
list_2.add(2);
list_2.add(3);
list_2.add(4);

Я получаю правильный результат для вызова:

println!("Element is at index {:?}", list_2.get_index(1));

1 Ответ

1 голос
/ 12 мая 2019

Вот MCVE вашей проблемы:

fn main() {
    let data = vec!["John", "Bill"];

    let v = data.binary_search_by(|probe| probe.cmp(&"John")).ok();

    println!("{:?}", v);
}

Первое предложение документации для binary_search_by гласит (выделено мое):

Двоичный поиск этого отсортированного среза с функцией сравнения.

Ваши данные (скорее всего, потому что вы не указали соответствующий код) не отсортированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...