如何通过 Anylogic 中的基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?
Posted
技术标签:
【中文标题】如何通过 Anylogic 中的基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?【英文标题】:How to solve "java.lang.IndexOutOfBoundsException" problem via Agent-based modeling in Anylogic? 【发布时间】:2021-12-27 11:20:39 【问题描述】:我想将停车分配给每个订单,然后从其他停车的订单集中删除停车分配订单时遇到问题。这个数组列表 arr_assignedOrderSet 的大小为 22,因此它应该迭代 22 次。但我不知道为什么它在 11 次后停止了。如果我将迭代次数 arr_assignedOrderSet.size() 替换为 22,它将显示错误“java.lang.IndexOutOfBoundsException: Index 11 out of bounds for length 11 ”。代码如下:
ArrayList<Order> arr_assignedOrderSet = new ArrayList<Order>();
arr_assignedOrderSet = pop_parkings.get(index).orderSet;
for(int i=0; i<arr_assignedOrderSet.size(); i++)
Order order = arr_assignedOrderSet.get(i);
for(int j=0; j<order.col_parking.size(); j++)
Parking p = order.col_parking.get(j);
p.orderSet.remove(order);
非常感谢您的帮助~ ;-)
【问题讨论】:
如何创建pop_orders
代理?一开始你创建了 22 个?
我创建了 100 个订单,并首先将停车位分配给其中的 22 个订单。
你什么时候运行这些循环?一开始?
你说“arr_assignedOrderSet 中有 22 个订单,像这样:”但代码清楚地显示只有 11 个 :)
是的,你是对的!当我评论“order.col_parking”的循环并打印出“arr_assignedOrderSet.size()”的循环时,我可以得到22个订单。但是我不知道为什么如果我把循环放回去,结果减半......
【参考方案1】:
在不完全理解您的模型的情况下,11 恰好是 22 的二分之一似乎很可疑,这意味着以下语句:p.orderSet.remove(order);
正在缩小相同的orderSet
,通过pop_parkings.get(index).orderSet
变量在pop_parkings.get(index).orderSet
中迭代。当这个赋值发生时arr_assignedOrderSet = pop_parkings.get(index).orderSet;
Java 实际上并没有复制集合的内容,只是复制了对它的引用。如果是这种情况,那么解决方法是替换这一行:
arr_assignedOrderSet = pop_parkings.get(index).orderSet;
用这一行:
arr_assignedOrderSet.addAll(pop_parkings.get(index).orderSet);
【讨论】:
您好,Artem,感谢您的回答。当我打印出这个数组列表的结果时,一切正常,如下所示,“arr_assignedOrderSet 中有 22 个订单,如下所示:”。这意味着更改代码后,我仍然得到相同的结果。 :( 还是谢谢你。 您可以在开始删除元素之前将其打印出来,因此它在打印时看起来很好,但在运行时却不行。你知道哪一行导致索引越界错误吗? 您好 Artem,非常感谢您的建议。我发现错误在于这一行: Order order = arr_assignedOrderSet.get(i);当我将其更改为 Order order = arr_assignedOrderSet.get(0); 时,问题得到了解决获取每个元素,直到数组变空。以上是关于如何通过 Anylogic 中的基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?的主要内容,如果未能解决你的问题,请参考以下文章
anylogic,流程建模库:split.如何设置和引用代理副本的属性?
Anylogic:如何根据代理的参数在 ResourcePool 中对设置时间(工具更换)进行建模?