1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
use super::basic::{Leaf, Node, Trie}; use std::cell::RefCell; use std::cmp::Eq; use std::hash::Hash; use std::rc::Rc; #[derive(Debug)] pub struct WordTrie { inner: Rc<RefCell<Node<String>>>, } impl WordTrie { fn new() -> WordTrie { WordTrie { inner: Node::new() } } fn insert_words(&self, words: &str, target: &str) { let m_words = WordTrie::split_words(words); self.insert(&m_words, target.to_string()) } fn split_words(words: &str) -> Vec<String> { let res: Vec<String> = words.chars().map(|word| word.to_string()).collect(); res } fn insert(&self, words: &[String], target: String) { let mut leaf = Leaf::<String>::Nil; if target != "".to_string() { leaf = Leaf::<String>::End(target); } Node::insert_seq(self.inner.clone(), words, leaf); } fn get_leaf(&self, words: &[String]) -> Leaf<String> { Node::get_leaf(self.inner.clone(), words) } } #[test] fn test_word() { let word_trie = WordTrie::new(); let seq = "你在干什么"; let seq1 = "你在找什么"; word_trie.insert_words(seq, "没干嘛"); word_trie.insert_words(seq1, "是吗"); println!("{:?}", word_trie); assert!(true); }