挿入順序を維持する(Vecと思う)が、一意の値(HashSetと思う)だけを追跡するタイプはありますか?私はVec
を使用しないでください。挿入する前にその値が存在するかどうかを最初に確認する必要があるからです。挿入順序を維持するセットタイプ
1
A
答えて
1
linked_hash_set
クレートが入手可能です。これは、 linked-hash-map
ベースのstd HashSet
APIを可能な限り密接に反映しています。
extern crate linked_hash_set;
use linked_hash_set::LinkedHashSet;
let mut set = LinkedHashSet::new();
set.insert(234);
set.insert(123);
set.insert(345);
set.insert(123);
assert_eq!(set.into_iter().collect::<Vec<_>>(), vec![234, 345, 123]);
3
linked-hash-map
crateは、キー値の挿入順序を保持するハッシュマップを提供します。我々は(std::collections::HashSet
がこのように実装されている)の値として()
を使用して、このハッシュマップの設定ラッパーを作成することができます
extern crate linked_hash_map;
use linked_hash_map::*;
use std::collections::hash_map::RandomState;
use std::hash::{BuildHasher, Hash};
use std::borrow::Borrow;
fn main() {
let mut s = LinkedHashSet::new();
s.insert(5);
s.insert(3);
s.insert(7);
s.insert(1);
assert_eq!(vec![5, 3, 7, 1], s.iter().cloned().collect::<Vec<_>>());
s.remove(&7);
assert_eq!(vec![5, 3, 1], s.iter().cloned().collect::<Vec<_>>());
s.remove(&5);
assert_eq!(vec![3, 1], s.iter().cloned().collect::<Vec<_>>());
}
pub struct LinkedHashSet<K, S = RandomState>(LinkedHashMap<K,(), S>);
impl<K: Hash + Eq> LinkedHashSet<K> {
pub fn new() -> Self {
LinkedHashSet(LinkedHashMap::new())
}
}
impl<K: Hash + Eq, S: BuildHasher> LinkedHashSet<K, S> {
pub fn insert(&mut self, k: K) -> Option<()> {
self.0.insert(k,())
}
pub fn contains<Q: ?Sized>(&self, k: &Q) -> bool
where K: Borrow<Q>,
Q: Eq + Hash
{
self.0.contains_key(k)
}
pub fn remove<Q: ?Sized>(&mut self, k: &Q) -> Option<()>
where K: Borrow<Q>,
Q: Eq + Hash
{
self.0.remove(k)
}
pub fn iter(&self) -> Keys<K,()> {
self.0.keys()
}
}
あなたが他のメソッドを実装することができます。 LinkedHashMap
docsを参照してください。
関連する問題
- 1. SetMultiMapを平坦化して挿入順序を維持する
- 2. guava SetMultimapでの挿入順序を維持する
- 3. Rubyはハッシュの挿入順序を維持します
- 4. 順序を挿入し維持し、そのインデックス
- 5. 挿入順序を維持するコンカレントセットを実装する方法
- 6. 共有設定への挿入順序を維持する方法は?
- 7. ベクトルの順序を維持する
- 8. C3スタックチャートデータの順序を維持する
- 9. json.simpleの使い方は? jsonの挿入順序を維持できますか?
- 10. Postgresとoracleは挿入順序を維持していますか?
- 11. Javaは挿入順序と重複した値を維持します
- 12. はJavaScript - オブジェクトキー値の順序を維持
- 13. サブセット/順序を維持し、R
- 14. 行挿入順序エンティティ・フレームワーク
- 15. バッチインサートの挿入順序
- 16. 挿入を維持するマップ(コレクション)
- 17. オブジェクトをシリアライズし、xs:groupの順序を維持する
- 18. JSFデータテーブルまたはデータモデルの順序を維持する方法
- 19. 逐次計算中に操作の順序を維持する
- 20. DjangoテストクライアントのPOSTパラメータの順序を維持するには?
- 21. graphql/relayで順序付きリストを維持する
- 22. WHERE SQLでの順序選択を維持する
- 23. 発信キュー内のメッセージの順序を維持する - .Net
- 24. Doctrine2 - コレクションの順序を維持する方法は?
- 25. linuxの `top`のフィールド順序を維持する
- 26. リストボックスアイテムの順序をDataGridViewに維持する方法
- 27. JSDoc出力内のコメントの順序を維持する
- 28. カフカのメッセージの順序を維持する方法は?
- 29. log4j + MongoDBのイベントの順序を維持する
- 30. C#でソートして元のリストの順序を維持する
[linked-hash-map](https://crates.io/crates/linked-hash-map)のクレートは見ましたか?たぶんあなたは 'V =()'でラップを作ることができます。 – malbarbo
本質的に、セットとしてのhttp://stackoverflow.com/q/30243100/155423の重複は値のない単なるマップです。 – Shepmaster
要素の追加と要素のコピーのみが可能な場合は、重複チェック用のセットと要素を順番に格納するベクトルを使用して、セットとベクタの両方を使用することができます。 – CodesInChaos