在我的anylogic模型中,我想在队列块进入时将orderID、处理时间和到期日期添加到列表中。这很好。现在我想在订单离开队列的那一刻从列表中删除此信息,因此在退出时,但是我无法使其工作。
我有以下内容:
class ExportInfo {
private int id;
private int P;
private double d;
public ExportInfo(int id, int P, double d) {
this.id=id;
this.P=P;
this.d=d;
}
}
LinkedList<ExportInfo> list = new LinkedList();
在我的队列块上输入:
new ExportInfo(agent.atrID, agent.atrEstimatedPackingTime, dateToTime(agent.atrDueDate));
list.add(new ExportInfo(agent.atrID, agent.atrEstimatedPackingTime, dateToTime(agent.atrDueDate)));
在退出:
new ExportInfo(agent.atrID, agent.atrEstimatedPackingTime, dateToTime(agent.atrDueDate));
list.remove(new ExportInfo(agent.atrID, agent.atrEstimatedPackingTime, dateToTime(agent.atrDueDate)));
在某个时候,我将结果写入一个Excel文件。如果我只将信息添加到列表中,我首先检查了结果。在Excel文件中,我看到了输入的所有订单信息(假设是6)。
然后我也尝试了remove
,这意味着在信息被写入Excel的那一刻,它应该只包含没有离开队列的订单的信息(因为在这种情况下,他们的信息应该从列表中删除)。在我将信息写入Excel文件时,我可以看到队列中有4个订单,但是进入队列的所有6个订单的信息仍然存在,因此离开队列的2个订单的信息没有被删除。
有谁知道我怎么解决这个问题吗?
您不断地添加和删除ExportInfo
的新实例,这是没有意义的。
在进入时在队列块中添加一次条目。另外,将ExportInfo
作为变量myExportInfo
存储在实际代理中,以便它在队列退出之前记住它。
在Queue exit中,您希望更改ExportInfo
对象中的退出时间,但不创建新的退出时间。因此,使用setter设置队列退出时间,如agent.myExportInfo.setExitTime(...)
这将为您提供通过队列
的所有代理的完整列表。remove
将找不到对象,因为您构造了一个新对象,因此该对象尚未在列表中。
你应该:
-
保留对添加时创建的对象的引用,并在调用
remove
时使用该引用。 -
(效率较低:)迭代列表并寻找具有您正在寻找的属性的对象,然后删除它。