当需要2个键时,如何使用“table:get”(表扩展名)功能?

时间:2014-08-07 15:25:23

标签: hashtable netlogo

我有一个包含3列的文件.txt:ID-polygon-1,ID-polygon-2和distance。 当我将文件导入Netlogo时,我获得3个列表[[list1][list2][list3]],对应3列。

我使用table:from-list list创建了一个包含3个列表内容的表。 我获得了{{table: [[1 1] [67 518] [815 127]]}}(该表显示了我的数据集的前两行)。

例如,我想得到ID-polygon-1 = 1(list1)和ID-polygon-2 = 67(list1)之间的距离(list3)的值,即815。

当我需要2个键(ID-polygon-1和ID-polygon-2)时,如何使用table:get table key

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

使用table:from-list对您没有帮助:它期望"两个元素列表或对的列表" "对中的第一个元素是键,第二个元素是值。"这不是原始列表中的内容。

此外,NetLogo表(以及一般的associative arrays)不能有两个键。它们总是只是键值对。然而,没有什么可以阻止该值成为另一个表,在您的情况下,这就是您所需要的:表格表格!

然而,没有直接构建它的原语。您需要自己构建它:

extensions [ table ]
globals [ t ]

to setup
  let lists [
    [   1   1 ] ; ID-polygon-1 column
    [  67 518 ] ; ID-polygon-2 column
    [ 815 127 ] ; distance column
  ]
  set t table:make
  foreach n-values length first lists [ ? ] [
    let id1  item ? (item 0 lists)
    let id2  item ? (item 1 lists)
    let dist item ? (item 2 lists)
    if not table:has-key? t id1 [
      table:put t id1 table:make
    ]
    table:put (table:get t id1) id2 dist
  ]
end

以下是打印结果表时的结果:

{{table: [[1 {{table: [[67 815] [518 127]]}}]]}}

这里有一位小记者,可以方便地与桌子保持距离:

to-report get-dist [ id1 id2 ]
  report table:get (table:get t id1) id2
end

使用get-dist 1 67会提供您正在寻找的815结果。