双foreach循环

时间:2018-01-31 00:34:28

标签: netlogo

我有以下代码。

turtles-own [age]

set list1 (list 2 1 4 6)
set list2 (list (turtle 1) (turtle 0) (turtle 0) (turtle 0))

foreach list2 [ x ->
  foreach list1 [ y ->
     if (position x list2 = position y list1) [
       ask x [ set age (item(position y list1) list1 ]
    ]
   ]
  ]

我想要做的是迭代海龟列表和年龄列表。如果乌龟的索引与值的索引匹配,则将乌龟的年龄设置为该值。我的工作在某种程度上,但似乎list1中的值以某种方式影响foreach循环。例如,我使用滑块来确定list1中的年龄值。 List1 one以list1 (list a1 a2 a3 a4)的形式写成,对于每个a1,a2 a3,a4,我有一个滑块。根据我在滑块上设置的值,一些海龟得到的值而另一些没有。有时候所有海龟都会得到年龄值,所有这些都取决于我使用幻灯片设置的值。

如果有更好的方法可以做到这一点,那么这也会有所帮助。我只需要使用一个循环,将年龄值设置为相应的乌龟。我有一个更大的海龟列表,这就是我需要使用循环的原因。

非常感谢。

1 个答案:

答案 0 :(得分:4)

position仅报告列表中项目的第一个值。在此示例中,对于turtle 0循环中的每个foreachposition x list2将报告1.为了使其按原样运行,我认为您需要拥有所有项目在每个列表中都是唯一的。

不完全确定您在此之后的情况,但我认为您可以通过在每个循环中包含一个计数器来解决您的问题,并使用它来比较索引值,以及设置age使用item

turtles-own [age]
globals [ list1 list2 ]

to setup
  ca
  crt 2
  set list1 (list 2 1 4 6)
  set list2 (list (turtle 1) (turtle 0) (turtle 1) (turtle 0))

  let l2counter 0
  foreach list2 [ x ->
    let l1counter 0
    foreach list1 [ y ->
      if l2counter = l1counter [
        ask x [
          set age item l1counter list1
          show ( word "my age is now " age )
        ]
      ]
      set l1counter l1counter + 1
    ]
    set l2counter l2counter + 1
  ]
  reset-ticks
end

修改

如果您不需要使用索引,这可能是更好的方法:

to setup-2
  ca
  crt 2
  set list1 (list 2 1 4 6)
  set list2 (list (turtle 1) (turtle 0) (turtle 1) (turtle 0))

  ( foreach list2 list1 [
    [ _turt _age ] ->
    ask _turt [
      set age _age
    ]
    ]
  )  
end