我试图使用HashSet<String>作为其他HashSet的密钥。我已经找到了这个问题和答案,它指出要为HashSet<String>实现Hash特性,但我无法让我的具体案例发挥作用。
幸运的是,我的案子更受约束,所以我需要的是:
hash 的类型HashSet<String>集合{"q3", "q1", "q2"}应该被散列为一个简单有序的字符串版本,类似于hash("q1-q2-q3")。获取"q1-q2-q3"不是问题,但是在hash中使用它会引发所有我无法处理的错误。
这是我实现的尝试,但不起作用。我认为StateSet包装器不是正确的方法,因为我失去了所有重要的HashSet方法。
use std::collections::{HashMap,HashSet};
use std::hash::{Hash,Hasher};
type State = String;
struct StateSet(HashSet<State>);
impl PartialEq for StateSet {
fn eq(&self, other: &StateSet) -> bool {
self.is_subset(&other) && other.is_subset(&self)
}
}
impl Eq for StateSet {}
impl Hash for StateSet {
fn hash<H>(&self, state: &mut H) where H: Hasher {
let a: Vec<State> = self.iter().collect();
a.sort();
for s in a.iter() {
s.hash(state);
}
}
}
fn main() {
let hmap: HashSet<StateSet> = HashSet::new();
}(游乐场)
发布于 2016-04-12 02:38:56
您的代码有几个问题,主要问题是您试图通过在新类型包装器上调用方法来访问HashSet上的方法。您需要在HashSet上直接调用它们,将self替换为self.0。下面是最后的工作代码:
use std::collections::{HashMap,HashSet};
use std::hash::{Hash,Hasher};
type State = String;
struct StateSet(HashSet<State>);
impl PartialEq for StateSet {
fn eq(&self, other: &StateSet) -> bool {
self.0.is_subset(&other.0) && other.0.is_subset(&self.0)
}
}
impl Eq for StateSet {}
impl Hash for StateSet {
fn hash<H>(&self, state: &mut H) where H: Hasher {
let mut a: Vec<&State> = self.0.iter().collect();
a.sort();
for s in a.iter() {
s.hash(state);
}
}
}
fn main() {
let hmap: HashSet<StateSet> = HashSet::new();
}此外,我强烈建议您在这里使用BTreeSet,它实现Hash,因为它按排序顺序存储元素。它的Hash实现肯定比您的实现要快,因为您的实现完成了O(n log(n))类型的所有项。
https://stackoverflow.com/questions/36562419
复制相似问题