Как преобразовать HashSet из строк в вектор? - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь преобразовать HashSet<String> в отсортированный вектор, который затем можно join редактировать с запятыми:

use std::collections::HashSet;

fn main() {
    let mut hs = HashSet::<String>::new();
    hs.insert(String::from("fee"));
    hs.insert(String::from("fie"));
    hs.insert(String::from("foo"));
    hs.insert(String::from("fum"));

    let mut v: Vec<&String> = hs.iter().collect();
    v.sort();

    println!("{}", v.join(", "));
}

Это не скомпилируется:

error[E0599]: no method named `join` found for struct `std::vec::Vec<&std::string::String>` in the current scope
  --> src/main.rs:13:22
   |
13 |     println!("{}", v.join(", "));
   |                      ^^^^ method not found in `std::vec::Vec<&std::string::String>`

Я понимаю, почему я не могу присоединиться к Vec<&String>, но как вместо этого преобразовать HashSet в Vec<String>, чтобы его можно было объединить?

Примеры, приведенные в Что идиоматический c способ печати итератора, разделенного пробелами в Rust? , похоже, не применяется, потому что итератор для Args возвращает String значений, в отличие от итератора для HashSet, который возвращает &String.

1 Ответ

4 голосов
/ 27 марта 2020

Я рекомендую вам перечитать Язык программирования Rust , в частности главу об итераторах . Затем ознакомьтесь с методами Iterator.

Обычный способ, которым я ожидал бы увидеть это реализованным, - преобразовать HashSet в итератор, а затем collect итератор для Vec:

let mut v: Vec<_> = hs.into_iter().collect();

В этом случае я бы предпочел использовать FromIterator напрямую (та же самая черта, которая дает collect):

let mut v = Vec::from_iter(hs);

Сосредоточив внимание на более крупной проблеме, используйте вместо этого BTreeSet в сочетании с Что такое идиоматический c способ печати итератора, разделенного пробелами в Rust?

use itertools::Itertools;
use std::collections::BTreeSet; // 0.9.0

fn main() {
    // Create the set somehow
    let hs: BTreeSet<_> = ["fee", "fie", "foo", "fum"]
        .iter()
        .copied()
        .map(String::from)
        .collect();

    println!("{}", hs.iter().format(", "));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...