проверьте, есть ли в коллекции структур повторяющиеся значения в полях - PullRequest
0 голосов
/ 07 мая 2020

Я хочу извлечь некоторые данные в виде вектора из некоторых структур, чтобы проверить, есть ли дубликаты

#[derive(Debug)]
struct Test {
    id: i32,
    name: String
}

fn main() {

    let test1 = Test { id: 1, name: String::from("one") };
    let test2 = Test { id: 2, name: String::from("two") };
    let test3 = Test{ id: 3, name: String::from("one") };

    let mut small_collection = Vec::new();
    small_collection.push(test1);
    small_collection.push(test2);
    small_collection.push(test3);


     let uniques : Vec<String> = small_collection.iter()
        .map(|x| x.name.as_str())
        .collect();

    //let num_dups = clients.len() - uniques.len();

}

Программа создает small_collections структур. Однако после создания вектора я хочу проверить, есть ли дубликаты в поле Test.name.

Итак, я пытаюсь выполнить итерацию и создать новый вектор. Если len () для моих коллекций и сокращенных имен одинаковы, то дубликатов нет. В этом случае значение «единица» появляется дважды.

Как бы то ни было, я могу помочь?

1 Ответ

1 голос
/ 07 мая 2020

Вы можете уменьшить Vec только до уникальных значений, вызвав sort, а затем dedup на Vec, например:

#[derive(Debug)]
struct Test {
    id: i32,
    name: String
}

fn main() {
    let test1 = Test { id: 1, name: String::from("one") };
    let test2 = Test { id: 2, name: String::from("two") };
    let test3 = Test { id: 3, name: String::from("one") };

    let mut small_collection = Vec::new();
    small_collection.push(test1);
    small_collection.push(test2);
    small_collection.push(test3);

    let mut uniques: Vec<&str> = small_collection.iter()
        .map(|x| x.name.as_str())
        .collect();

    uniques.sort();
    uniques.dedup();

    let num_dups = small_collection.len() - uniques.len();
    assert_eq!(num_dups, 1);
}

игровая площадка

Вы можете превратить его в однострочник, собрав в HashSet (который по умолчанию не хранит дубликаты):

use std::collections::HashSet;

#[derive(Debug)]
struct Test {
    id: i32,
    name: String
}

fn main() {
    let test1 = Test { id: 1, name: String::from("one") };
    let test2 = Test { id: 2, name: String::from("two") };
    let test3 = Test { id: 3, name: String::from("one") };

    let mut small_collection = Vec::new();
    small_collection.push(test1);
    small_collection.push(test2);
    small_collection.push(test3);

    let uniques_len = small_collection.iter()
        .map(|x| x.name.as_str())
        .collect::<HashSet<&str>>()
        .len();

    let num_dups = small_collection.len() - uniques_len;
    assert_eq!(num_dups, 1);
}

детская площадка

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