Решение на Search от Емилиан Станков

Обратно към всички решения

Към профила на Емилиан Станков

Резултати

  • 15 точки от тестове
  • 1 бонус точка
  • 16 точки общо
  • 5 успешни тест(а)
  • 0 неуспешни тест(а)

Код

use std::collections::HashSet;
use std::collections::HashMap;
macro_rules! set {
($($item:expr),*) => {
{
let mut hash_set = ::std::collections::HashSet::new();
$( hash_set.insert($item); );*
hash_set
}
};
}
pub fn extract_words(text: &str) -> Vec<String> {
let mut word: String = String::new();
let mut words: Vec<String> = vec![];
let mut chars = text.chars();
while let Some(c) = chars.next() {
if c.is_alphabetic() {
word.push(c);
} else {
if word != "" {
words.push(word)
}
word = String::new();
}
}
if word != "" {
words.push(word)
}
words
}
pub struct TextIndex<'a> {
words: HashMap<String, HashSet<&'a str>>
}
impl<'a> TextIndex<'a> {
pub fn new() -> Self {
TextIndex {
words: HashMap::new()
}
}
pub fn push(&mut self, text: &'a str) {
for word in extract_words(text) {
if let Some(w) = self.words.get_mut(&word) {
w.insert(text);
}
if !self.words.contains_key(&word) {
self.words.insert(word, set!{text});
}
}
}
pub fn search(&self, query: &str) -> HashSet<&str> {
let mut strings = set!{};
for word in extract_words(query) {
if self.words.contains_key(&word) {
for s in self.words.get(&word).unwrap() {
strings.insert(s.clone());
}
}
}
strings
}
}

Лог от изпълнението

Compiling solution v0.1.0 (file:///tmp/d20180105-6053-jsdgnt/solution)
warning: variable does not need to be mutable
  --> src/lib.rs:7:17
   |
7  |             let mut hash_set = ::std::collections::HashSet::new();
   |                 ---^^^^^^^^^
   |                 |
   |                 help: remove this `mut`
...
57 |         let mut strings = set!{};
   |                           ------ in this macro invocation
   |
   = note: #[warn(unused_mut)] on by default

warning: variable does not need to be mutable
  --> src/lib.rs:7:17
   |
7  |             let mut hash_set = ::std::collections::HashSet::new();
   |                 ---^^^^^^^^^
   |                 |
   |                 help: remove this `mut`
...
57 |         let mut strings = set!{};
   |                           ------ in this macro invocation
   |
   = note: #[warn(unused_mut)] on by default

    Finished dev [unoptimized + debuginfo] target(s) in 4.99 secs
     Running target/debug/deps/solution-3f98bfa5c86a5dd9

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

     Running target/debug/deps/solution_test-3d9e4ea2eafbbc82

running 5 tests
test solution_test::test_extract_words_basic ... ok
test solution_test::test_extract_words_extra ... ok
test solution_test::test_search_multiple_words ... ok
test solution_test::test_search_special_cases ... ok
test solution_test::test_search_word ... ok

test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

   Doc-tests solution

running 0 tests

test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

История (1 версия и 1 коментар)

Емилиан качи първо решение на 03.01.2018 23:47 (преди над 7 години)

Хмм, зачудих се за clone-а, но всъщност ти клонираш &str, което е ок. Не ти трябва, обаче, онзи s.clone() може да е просто *s -- получаваш &&str, и искаш да върнеш &str.

Другото нещо е, че като вкарваш &str-та, те трябва да са own-нати от нещо извън TextIndex-а, което не би било твърде удобно за хората, които биха ползвали библиотеката. Не съм го уточнявал обаче, така че е ок. Получаваш бонус точка :).