How to use the function “table:get” (table extension) when 2 keys are required?

爷,独闯天下 提交于 2019-12-10 17:49:24

问题


I have a file .txt with 3 columns: ID-polygon-1, ID-polygon-2 and distance. When I import my file into Netlogo, I obtain 3 lists [[list1][list2][list3]] which corresponds with the 3 columns.

I used table:from-list list to create a table with the content of 3 lists. I obtain {{table: [[1 1] [67 518] [815 127]]}} (The table displays the first two lines of my dataset).

For example, I would like to get the value of distance (list3) between ID-polygon-1 = 1 (list1) and ID-polygon-2 = 67 (list1), that is, 815.

How can I use table:get table key when I have need of 2 keys (ID-polygon-1 and ID-polygon-2) ?

Thanks very much your help.


回答1:


Using table:from-list will not help you there: it expects "a list of two element lists, or pairs" where the "the first element in the pair is the key and the second element is the value." That's not what you have in your original list.

Furthermore, NetLogo tables (and associative arrays in general) cannot have two keys. They are always just key-value pairs. Nothing prevents the value from being another table, however, and in your case, that is what you need: a table of tables!

There is no primitive to build that directly, however. You will need to build it yourself:

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

Here is what you get when you print the resulting table:

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

And here is a small reporter to make it convenient to get a distance from the table:

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

Using get-dist 1 67 will give the 815 result you were looking for.



来源:https://stackoverflow.com/questions/25186352/how-to-use-the-function-tableget-table-extension-when-2-keys-are-required

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!