HashSet封装了允许比较集合中元素的操作。 HashSets经常用于确定集合中的重叠元素和唯一元素。
我目前面临着拥有包含数百万个数据集的大型 xml 的问题。读取并反序列化它们之后(不需要太多时间),需要将数据写入数据库(
我正在尝试在 A* 算法上实现缓存路径列表。目前,缓存的路径存储在如下列表中: 只读列表 _cachedPaths = 新列表 我正在尝试在 A* 算法上实现缓存路径列表。目前,缓存的路径存储在如下列表中: readonly List<CachedPath> _cachedPaths = new List<CachedPath>(); 对此列表执行的操作是: FirstOrDefault 获取满足一定条件的元素 var cached = _cachedPaths.FirstOrDefault(p => p.From == from && p.To == target && p.Actor == self); 删除并元素 _cachedPaths.Remove(cached); 补充 _cachedPaths.Add(new CachedPath { From = from, To = target, Actor = self, Result = pb, Tick = _world.WorldTick }); 注意:类 CachedPath 的 GetHashCode 和 Equals 被 From、To 和 Actor 覆盖,因此具有这些相同属性的两个实例具有相同的哈希值和相等性。 考虑到“HashSet”中的快速查找(包含)、插入和删除都是 O(1)(如果我没记错的话),我考虑使用“HashSet”来执行这些操作。唯一的问题是 FirstOrDefault,我必须枚举整个集合才能获取它。 考虑到这个问题,我还考虑使用由 From、To 和 Actor 的哈希索引索引的字典: Dictionary<int, CachedPath> cachedPath 再次强调一下,如果我没记错的话,Dictionary 还提供了 O(1) 的插入、删除以及通过 Key 检索的功能。这让我认为字典是一个 HashSet + O(1) 元素检索能力。 我错过了什么吗? Dictionary 真的比 HashSet 更好,因为它支持更多操作吗? 提前致谢。 Dictionary并不比HashSet更好,只是不同而已。 当您想要存储无序的项目集合时,可以使用 HashSet,并且 当您想要将一组称为“键”的项目与另一个称为“值”的项目集合关联时,可以使用 Dictionary 人们可以将 HashSet 视为没有关联值的 Dictionary(事实上,HashSet 有时在幕后使用 Dictionary 来实现),但没有必要以这种方式考虑它:将两者视为完全不同的事物也很好。 在您的情况下,您可以通过按演员制作字典来提高性能,如下所示: Dictionary<ActorType,List<CachedPath>> _cachedPathsByActor 这样,您的线性搜索将快速选择基于演员的子列表,然后按目标进行线性搜索: var cached = _cachedPathsByActor[self].FirstOrDefault(p => p.From == from && p.To == target); 或者通过创建一个考虑所有三个项目的相等比较器,并使用 Dictionary 和 CachedPath 作为键和值,并将自定义 IEqualityComparer<T> 作为键比较器: class CachedPathEqualityComparer : IEqualityComparer<CachedPath> { public bool Equals(CachedPath a, CachedPath b) { return a.Actor == b.Actor && a.From == b.From && a.To == b.To; } public int GetHashCode(CachedPath p) { return 31*31*p.Actor.GetHashCode()+31*p.From.GetHashCode()+p.To.GetHashCode(); } } ... var _cachedPaths = new Dictionary<CachedPath,CachedPath>(new CachedPathEqualityComparer()); ... CachedPath cached; if (_cachedPaths.TryGetValue(self, out cached)) { ... } 但是,这种方法假设字典中最多有一个项目具有相同的 From、To 和 Actor。 哈希集在执行添加时不会抛出异常。相反,它返回一个布尔值,反映添加成功。 哈希集也不需要键值对。 我使用哈希集来保证唯一值的集合。 HashSet 似乎足以满足您需要做的事情:存储唯一路径并检查路径是否已存储并将其删除。 这是关于美学的:你的代码读起来就像是带有集合的数学证明,而不是操作字典的过程。 不要使用FirstOrDefault;只需使用 HashSet.Contains(p) 和 HashSet.Remove(p) ,其中“p”是 CachedPath 的新实例,具有您正在查找的属性。 我遇到了完全相同的问题,这就是我遇到这篇文章的原因。我的情况与您的情况类似,存储的项目需要通过多个属性有效地查找。然而,就我而言,存储的项目和用于搜索的项目并不相同;它们仅具有用作密钥的潜在相同属性组合,而其余属性则不同。 这就是为什么我需要一个字典和一个关于属性组合的自定义比较器。我需要存储的实际项目,因为它与我搜索时使用的项目不同。 但在您的情况下,如果一个缓存路径具有相同的属性,则它们与另一个缓存路径相同。这就是为什么您可以使用更简单的 HashSet。您不需要从 HashSet 中检索项目,因为您只需构造一个项目的新实例并使用它来检查哈希集是否已包含其等效项,并从哈希集中删除该等效项。
我正在开发一种基于数学的编程语言(用 Rust 编写),它使用集合而不是类型。其中,变量或值属于一组值(例如 x : {1, 2, 3} 或 msg : Str)。那个...
如何用另一个 HashSet<String> 扩展一个 HashSet<String>?
当我尝试用另一个 HashSet 扩展一个 HashSet 时: 使用 std::collections::HashSet; 让 mut a = HashSet::new(); a.insert("foo".to_owned()); 让 mut b = HashSet...
Java HashSet removeAll 不保留相同的值
我有 2 个包含数字的字符串,我想使用 set removeAll 来找出一组是否包含其他字符串的数字。我使用 Hashet (但我也可以 parseInt 并使用 HashSet)。我不...
EFCoreWhere(...set.Contains(...))关心Set是List还是HashSet吗?
正是标题中的问题。 假设我使用 EFCore 查询 SQL DB,并且我写道: myTableDbSet.Where(entity => filterSet.Contains(entity.Id)) 那么它有什么区别吗(例如
我正在研究 Leetcode 问题“字符串的反向元音”。 这是我的第一个解决方案: 类解决方案{ 公共字符串reverseVowels(字符串s){ 字符串元音 = "
假设我有一些函数 do_stuff 接受 &HashSet 并希望通过复制所有元素将项目收集到 Vec 中。做到这一点的规范方法是什么?我有
我是数据结构和算法的新手,正在开始做NeetCode 150题。我遇到的第一个问题并不困难,我明白为什么它有效,但我很好奇为什么......
Delphi中有HashSet吗? 我知道使用 set 最多可以容纳 255 个项目。最新的 Delphi 编译器中是否有 HashSet,例如XE8,西雅图
我想使用 HashSet,但担心它“默默地”吸收重复项(通过返回 true/false),而不是抛出异常。我对一个等效的数据结构感兴趣
我有一套如下: HashSet set = new HashSet(); 设置.add(1); 怎么才能把1取出来呢?我可以通过 for(integer i : set) 来做到这一点。我指定的问题是“鉴于...
我对 HashMap 和 HashSet 如何管理多个键或值感到困惑
我对 hashMap 和 hashSet 内部功能的了解非常少,我需要帮助! 所以: 哈希映射: 我不能放置两个具有相同键的对象,所以当我有对象 A 和 B 时,第一个对象有, 对于
如何在C#中构建一个Set,仅通过引用相等性来比较项目,而不是HashSet使用的HashCode?
例如,如果我想要一组具有不同引用的字符串,并允许它们具有相同的值,该怎么办? 字符串 s1 = "字符串1"; 字符串 s2 = "字符串1"; 控制台.Writ...
我想知道为什么人们会使用std::unordered_multiset。我的猜测是它与插入/擦除后迭代器的失效或非失效有关,但也许它是……
在一个子问题中,我想获得我访问过的x-y平面上的点总数。并且每个点都必须是唯一的。 IE。如果你已经访问过 (1,2) 并且如果你再次遇到这个你就不会
尝试解决217。在C中使用HashSet包含重复项。 在我尝试使计算的索引始终为 (+) 后,我收到错误。 #定义 BUCKET_SIZE 1000 typedef struct ListNodes { 弗吉尼亚州...
我只想知道 HashSet hs 是否为空。 我不想知道它到底包含多少元素。 所以我可以用这个: bool isEmpty = (hs.Count == 0); ...或者...
我在 C# 中有一个哈希集,如果在迭代哈希集时满足条件,我将从中删除该哈希集,并且无法使用 foreach 循环来执行此操作,如下所示。 foreach(哈希集中的字符串 hashVal) { ...