简体   繁体   English

如何在 Anylogic 中通过基于代理的建模解决“java.lang.IndexOutOfBoundsException”问题?

[英]How to solve "java.lang.IndexOutOfBoundsException" problem via Agent-based modeling in Anylogic?

I met a problem when I want to assign the parking to each order, and then remove the parking-assined order from other parkings' order sets.当我想将停车分配给每个订单时遇到问题,然后从其他停车的订单集中删除停车辅助订单。 This array list arr_assignedOrderSet has a size of 22, so it was supposed to iterate 22 times.这个数组列表arr_assignedOrderSet的大小为 22,所以它应该迭代 22 次。 But I have no idea why it stoped after 11 times.但我不知道为什么它在 11 次后停止了。 If I replace the iterated times arr_assignedOrderSet.size() with 22 , it will show me an error of "java.lang.IndexOutOfBoundsException: Index 11 out of bounds for length 11".如果我将迭代时间arr_assignedOrderSet.size()替换为22 ,它将显示“java.lang.IndexOutOfBoundsException: Index 11 out of bounds for length 11”的错误。 The codes are as following:代码如下:

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);
    }

}

There are 22 orders in arr_assignedOrderSet, like this: arr_assignedOrderSet 中有 22 个订单,如下所示:

arr_assignedOrderSet
[root.pop_orders[0]( p_appointedTime = 161.0 ), root.pop_orders[2]( p_appointedTime = 202.0 ), 
    root.pop_orders[4]( p_appointedTime = 270.0 ), root.pop_orders[7]( p_appointedTime = 27.0 ), 
    root.pop_orders[13]( p_appointedTime = 143.0 ), root.pop_orders[32]( p_appointedTime = 75.0 ), 
    root.pop_orders[37]( p_appointedTime = 112.0 ), root.pop_orders[55]( p_appointedTime = 224.0 ), 
    root.pop_orders[58]( p_appointedTime = 71.0 ), root.pop_orders[84]( p_appointedTime = 181.0 ), 
    root.pop_orders[1]( p_appointedTime = 240.0 ), root.pop_orders[14]( p_appointedTime = 207.0 ), 
    root.pop_orders[20]( p_appointedTime = 84.0 ), root.pop_orders[25]( p_appointedTime = 40.0 ), 
    root.pop_orders[43]( p_appointedTime = 201.0 ), root.pop_orders[47]( p_appointedTime = 212.0 ), 
    root.pop_orders[54]( p_appointedTime = 254.0 ), root.pop_orders[69]( p_appointedTime = 197.0 ), 
    root.pop_orders[72]( p_appointedTime = 270.0 ), root.pop_orders[74]( p_appointedTime = 109.0 ), 
    root.pop_orders[78]( p_appointedTime = 80.0 ), root.pop_orders[79]( p_appointedTime = 287.0 )]

But when I retrival, the code only runs 11 times, here are the running results:但是当我retrieval时,代码只运行了11次,下面是运行结果:

orderroot.pop_orders[0]
remove fromroot.pop_parkings[0]
remove fromroot.pop_parkings[1]
i0
orderroot.pop_orders[4]
remove fromroot.pop_parkings[0]
remove fromroot.pop_parkings[1]
i1
orderroot.pop_orders[13]
remove fromroot.pop_parkings[0]
remove fromroot.pop_parkings[1]
i2
orderroot.pop_orders[37]
remove fromroot.pop_parkings[0]
remove fromroot.pop_parkings[1]
i3
orderroot.pop_orders[58]
remove fromroot.pop_parkings[0]
remove fromroot.pop_parkings[1]
i4
orderroot.pop_orders[1]
remove fromroot.pop_parkings[1]
remove fromroot.pop_parkings[2]
i5
orderroot.pop_orders[20]
remove fromroot.pop_parkings[1]
remove fromroot.pop_parkings[2]
i6
orderroot.pop_orders[43]
remove fromroot.pop_parkings[1]
remove fromroot.pop_parkings[2]
i7
orderroot.pop_orders[54]
remove fromroot.pop_parkings[1]
remove fromroot.pop_parkings[2]
i8
orderroot.pop_orders[72]
remove fromroot.pop_parkings[1]
remove fromroot.pop_parkings[2]
i9
orderroot.pop_orders[78]
remove fromroot.pop_parkings[1]
remove fromroot.pop_parkings[2]
i10

Thanks a lot for your help~ ;-)非常感谢您的帮助~ ;-)

Without fully understanding your model, it seems suspicious that 11 is exactly one half of 22, which would mean that this statement: p.orderSet.remove(order);如果没有完全理解你的模型,11 正好是 22 的一半似乎很可疑,这意味着这个语句: p.orderSet.remove(order); is shrinking the same orderSet being iterated in pop_parkings.get(index).orderSet via arr_assignedOrderSet variable.正在缩小通过arr_assignedOrderSet变量在pop_parkings.get(index).orderSet迭代的相同orderSet When this assignment happens arr_assignedOrderSet = pop_parkings.get(index).orderSet;当这个分配发生时arr_assignedOrderSet = pop_parkings.get(index).orderSet; Java isn't actually copying the content of the collection, only the reference to it. Java 实际上并没有复制集合的内容,只是复制对它的引用。 If that is the case then the fix is to replace this line:如果是这种情况,则修复方法是替换此行:

arr_assignedOrderSet = pop_parkings.get(index).orderSet;

with this line:用这一行:

arr_assignedOrderSet.addAll(pop_parkings.get(index).orderSet);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM