【问题标题】:Is it possible to declare a TObjectDictionary that has an array of TStringList as the value?是否可以声明一个具有 TStringList 数组作为值的 TObjectDictionary?
【发布时间】:2021-10-29 16:23:27
【问题描述】:

我有一个任务,我需要为包含以下结构的 JSON 文件创建一个专门的编辑器:

{
    "intents": [
        {
            "tag": <string_name>,
            "patterns": [
                <string>,
                <string>,
                <string>...
            ],
            "responses": [
                <string>,
                <string>,
                <string>...
            ],
            <repeats arbitrarily]
        }
    ]
}

表单有一个下拉菜单和两个TMemos。我们的想法是使用下拉菜单为每个tag 编辑patternsresponses。完成后,我保存回 JSON 文件。

我正在苦苦挣扎的是如何最好地将这些数据存储在内存中,以便轻松地从一个标签切换到另一个标签。我在想一个TObjectDictionary,其中tag名称作为键,值作为patternsresponses,但后来我意识到我必须实例化xTObjectDictionarys的数量动态地,每个tag 一个。

是否可以使用带有 string 字段和两个 TStringList 对象的动态数组来代替?我正在使用 TJsonTextReader 遍历 JSON 文件中的项目,并且效果很好。我只需要一些关于存储数据的最佳结构的想法。

【问题讨论】:

  • JSON 结构看起来设计不正确。似乎意图应该是一个地图而不是一个数组。
  • 您只需要一个 TObjectDictionary。使用字符串作为键,例如以两个动态数组作为值的记录: type TPatternsAndResponses = record Patterns: array of string;响应:字符串数组;结尾; var IntentsDict: TObjectDictionary 这假设意图数组的顺序并不重要。 (我认为不是。)
  • @DavidHeffernan 我无法控制 JSON 的结构。

标签: arrays dictionary object delphi dynamic


【解决方案1】:

您可以使用record 并将您想要的任何内容放入其中。然后创建一个记录实例数组。或者将记录实例存储为您的字典值。等等。

【讨论】:

  • 我将数据结构声明为 type TIntent = record patterns: TStringList;响应:TStringList 结束; ... var myDict: TDictionary;一个意图:TIntent; ...对于每个标签,我都会实例化一个 anIntent,当我完成填充它们时,我会将它们添加到 TDictionary 中,并以标签作为键。这似乎可行,但现在我正在努力理解如何将数据输入和输出字典。我需要将每个字符串列表的项目复制到匹配的 tmemo 中,反之亦然。使用密钥引用字符串列表的正确方法是什么?
  • 经过多次试验和错误后我想通了... myDict.TryGetValue(tagSelector.Items[tagSelector.ItemIndex],anIntent)
  • myDict['key'].patternsmyDict['key'].responses
  • 如果这些语句的键不存在会怎样?它会抛出异常吗? TryGetValue 没有,这让我可以提出一个无害的消息,表明无法找到意图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-07
相关资源
最近更新 更多