HashSet<String>
を他のキーのキーとして使用しようとしています。HashSet
のキーとして使用しています。 HashSet<String>
のHash
特性を実装すると指摘しているthis question and answerが見つかりましたが、私の場合は動作させることができませんでした。他のHashSetのキーとしてのHashSet
私の場合は、幸いにも多くの私が必要なものをとてもバインドされている: :
- が
hash
特性ハッシュは今のところ非常にシンプルであるべきHashSet<String>
- タイプのためにのみを実装
セット
{"q3", "q1", "q2"}
は、単純な順序付けされた連結文字列バージョン(例えば、hash("q1-q2-q3")
)としてハッシュされる必要があります。取得する"q1-q2-q3"
は問題ではありませんが、hash
の中でそれを使用すると、私は対処できないすべての種類のエラーをスローします。これは私の実装の試みですが、動作しません。私は私がすべての重要な
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(); }
(playground)を失うので
StateSet
ラッパーがそれを行うための正しい方法は、ないと思われる、主なものは、ということで、あなたのコードにはいくつかの問題がありました
マイナーニッツ: 'Vec <_>'と 'for s a a'。 – Shepmaster
ありがとうDogbert!あなたの答えを正しいものとしてマークします。 あなたのコードを使用した少し実用的な例を以下に示します。https://play.rust-lang.org/?gist=faad68f658e11f94ada25b6b0e8704f4&version=stable&backtrace=0 私は使用例に合っているかどうかを確認するためにBTreeSetについて詳しく説明します。ロット! – franleplant
Dogbert:私はBTreeSetをテストしましたが、それらは私が探していたものと全く同じです。セットの私の扱っているので、私のコードのいくつかの部分で注文する必要がありますので、彼らは自然に適合します。また、ハッシュの特性を実装する必要はありません。どうもありがとう! – franleplant