问题标签 [tdictionary]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
786 浏览

delphi - TDictionary - 无效键

我有这样的代码:

随机我看到 'v := myDict.Items[k];' 上抛出异常 其中说 k 无效。

还有人看到这个吗?

0 投票
3 回答
16966 浏览

delphi - 如何在 Delphi 2009 中按键按字母顺序列出 TDictionary?

如何使用 TEnumerator 按键按排序顺序浏览我的 TDictionary?

我有这样的事情:

所以我想按顺序处理我的字典:Dumb、Early、HelpMe、Tired。

不幸的是,Delphi 的帮助在描述一般的枚举器和 TEnumerator 的具体工作方式方面非常少,并且没有给出我能找到的示例。网上也很少有关于在 Delphi 中使用枚举器和泛型的文章。

而且我上面的示例代码甚至没有使用 TEnumerator,所以我对这一切是如何设计使用的感到困惑。


谢谢巴里,你的回答。

自从我问这个问题以来,我对泛型的冒险很有趣。我想开始在我的代码中实现它们。“排序”问题有点令人困惑,因为泛型似乎内置了处理排序的方法,但没有很好的示例或文档说明如何做到这一点。

最后,我按照 Barry 的建议做了,并在 Dictionary 中建立了一个外部索引。不过,感觉还是不太对。

然而,我有另一个惊喜:我试图用通用的 TDictionary 替换GabrGPStringHash。使用泛型的代码更简洁一些。但底线是 TDictionary 比 Gabr 慢 3 倍多。对 TryGetValue 的 1,704,667 次调用耗时 0.45 秒,但对 Gabr 例程的相同操作耗时 0.12 秒。我不知道为什么,但也许它就像 Gabr 一样简单,具有更快的哈希函数和分桶组合。或者,也许泛型必须针对每种情况进行泛化,这本质上会减慢速度。

尽管如此,也许 Barry 或其他 Delphi 开发人员应该看看这一点,因为 3 倍的加速最终可以使每个人受益。如果可以选择,我个人会更早地使用语言中内置的内容,而不是第三方包(甚至与 Gabr 的包一样好)。但现在,我会坚持使用 GPStringHash。

0 投票
1 回答
1198 浏览

delphi - 在 Delphi TDictionary 中,我的 Value 对象插入为 null

我正在使用 Delphi 9 的 TDictionary 泛型类。我的 TDictionary 看起来像这样:

而且,所以我像这样初始化 TDictionary:

我有一个 TList,我也在初始化,这样我就可以用它来填充 TDictionary。我正在循环一些用于填充 TList/TDictionary 的文件数据,并且我试图重新使用相同的 TList 作为值插入到 TDictionary 中。在第一次插入 TDictionary 时,项目的 TList 值存在并且其中包含数据。在第二次和随后的迭代中,TList 值全部为零。

在我看来,这一切都是通过参考来完成的。如何按值而不是引用将 TList 添加到我的 TDictionary?

0 投票
1 回答
5235 浏览

delphi - 如何从 TDictionary 中获取密钥?

我有一个TDictionary<TKeyClass, TValueClass>.

我想完成类似的事情

我不能再访问这些密钥了,如果我完全知道它们,我就可以使用它们。

唯一的选择是创建一个TDictionary<TValueClass, TKeyValue>?所以我可以通过按键循环?

我发现的解决方法是创建一个TList<TKeyClass>,但这是我不喜欢的。

0 投票
1 回答
753 浏览

performance - TDictionary 的默认 IEqualityComparer?

我刚读

“任何实现 IEqualityComparer 接口的类都应该提供Equals方法的实现。” -(德尔福文档维基

“任何实现 IEqualityComparer 接口的类都应该提供GetHashCode方法的实现。” -(德尔福文档维基

TDictionary<TObject, TObject>如果我创建一个而不实现一个 IEqualityComparer ,TDictionary 的性能将如何?

我还没有找到默认实现(在 Delphi 2009 中)。那么如何计算它们的键的哈希码呢?

如果它只是字典条目键中对象的内存地址,是否会按顺序执行对给定条目的搜索?

0 投票
3 回答
2864 浏览

delphi - TDictionary 的 Equals 和 GetHashCode

如果我使用 TDictionary 在 Delphi 中实现关系 Car <-> Owner,我应该如何实现 IEqualityComparer 的 Equals 和 GetHashCode 函数?(GetHashCode 返回一个 Integer,用于 TDictionary 中的散列。)

对于 TVehicle 类,假设它有一个 VIN(车辆识别号)。

我应该如何实现 VIN 的哈希码?

更新:在这个例子中,对象身份并不意味着“两个对象指针的内存位置的身份”,而是“同一对象的两个实例的身份,基于其属性的唯一和不变(“不可变”)组合” .

因此,我不需要通过地图中的内存地址搜索车辆,而是需要具有我正在寻找的 id 的车辆。

考虑一个包含车主数据的数据库,在应用程序启动时加载到字典中。现在,如果用户在申请表中输入 VIN,应用程序如何在字典中找到车辆?VehicleFactory.CreateVehicleFromDatabase(Edit1.Text);如果代码使用并在字典中搜索此对象创建一个新实例,则 Equals 的默认实现将不会在映射中找到任何条目,因为它会查找内存地址。为了找到车辆,Equals 需要比较 VIN。

所以我必须创建一个自定义的 IEqualityComparer。实现 Equals 是微不足道的。但是 GetHashCode 呢?对于字符串属性,我不能简单地使用字符串的地址(请参阅Are Delphi strings immutable中的 Berry Kelly :“如果您从两个单独的代码部分创建相同的字符串,它们将不会共享相同的后备存储”) ,因此字符串属性的 GetHashCode 函数需要自定义实现。

我还发现我发现了如何使用 Delphi 散列字符串?- 有一个例子,其中包含HashValue('Hello World')

0 投票
1 回答
11756 浏览

delphi - delphi字典迭代

早安!

TDictionary<String, TStringlist>我用字符串作为值和几个字符串作为值填充字典(delphi-collections-unit)。就像是:

  • 姓名 = 约翰、丽莎、斯坦
  • 技能 = 读、写、说
  • 年龄 = 12、14、16

(当然没有“,”)。我需要的是迭代这个字典并将值与键相乘。输出应该像

  • 姓名 = 约翰技能 = 阅读年龄 = 12
  • 姓名 = 约翰技能 = 阅读年龄 = 14
  • 姓名 = 约翰技能 = 阅读年龄 = 16
  • 姓名 = 约翰技能 = 写年龄 = 12
  • 姓名 = 约翰技能 = 写年龄 = 14
  • 姓名 = 约翰技能 = 写年龄 = 16
  • ...
  • 姓名 = 丽莎技能 = 阅读年龄 = 12
  • ...
  • 姓名 = 斯坦技能 = 说话年龄 = 16

所以每一个组合。我该怎么做?键的数量是动态的,tstringlist 的大小也是动态的。谢谢!现在解决了...

现在是范围的问题。以下是填充字典的过程。subsplits 和 splitstring 是字符串列表,它们在过程结束时被释放。dict是在程序块之后创建的(在main中?它是如何调用的?),调用填充方法,然后我想像代码示例中那样进行递归,但是dict中没有值... .

0 投票
1 回答
1159 浏览

delphi - delphi变量范围问题

我填写一个从文件中读取的字典,以迭代键值对。迭代在delphi 字典迭代中得到解决。

问题是 dict 中的值没有保留,可能是变量的范围问题。我更习惯于 java ......在将它们分配给过程 parsetextfile 中的字典后,这些值确实存在,然后迷路了:

0 投票
2 回答
1607 浏览

delphi - 如何为从 TDictionary 派生的类创建自定义枚举器?

我已经定义了一个从 TDictionary 派生的集合,并且需要定义一个应用附加过滤器的自定义枚举器。

我被卡住了,因为我无法访问 TDictionary FItems 数组(它是私有的),所以我无法定义 MoveNext 方法

您将如何继续在从 TDictionary 派生的类上重新定义过滤枚举数?

这是一个简单的代码来说明我想要做什么:

0 投票
4 回答
3644 浏览

delphi - 有没有一种简单的方法可以将 TDictionary 内容复制到另一个中?

是否有一种方法或简单的方法可以将一个 TDictionary 内容复制到另一个?假设我有以下声明

我想将 Source 1:1 复制到 Target。有这样的方法吗?

谢谢!