首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HashSet作为其他HashSet的密钥

HashSet作为其他HashSet的密钥
EN

Stack Overflow用户
提问于 2016-04-12 02:07:48
回答 1查看 1K关注 0票数 2

我试图使用HashSet<String>作为其他HashSet的密钥。我已经找到了这个问题和答案,它指出要为HashSet<String>实现Hash特性,但我无法让我的具体案例发挥作用。

幸运的是,我的案子更受约束,所以我需要的是:

  • 实现类型为hash 的类型HashSet<String>
  • 就目前而言,散列应该非常简单:

集合{"q3", "q1", "q2"}应该被散列为一个简单有序的字符串版本,类似于hash("q1-q2-q3")。获取"q1-q2-q3"不是问题,但是在hash中使用它会引发所有我无法处理的错误。

这是我实现的尝试,但不起作用。我认为StateSet包装器不是正确的方法,因为我失去了所有重要的HashSet方法。

代码语言:javascript
复制
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(); 
}

(游乐场)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-12 02:38:56

您的代码有几个问题,主要问题是您试图通过在新类型包装器上调用方法来访问HashSet上的方法。您需要在HashSet上直接调用它们,将self替换为self.0。下面是最后的工作代码:

代码语言:javascript
复制
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))类型的所有项。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36562419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档