在列表中查找,然后分配给变量,如果结果已存在于另一个变量中,则返回null

时间:2019-02-11 18:16:28

标签: java anylogic

我有两个变量和一个列表,我从以下列表中找到要分配给变量的项目:

var_A = tl_1;

var_B = findFirst(ground.getTargetLines(), n->n.getName().equals("tl_1"));

如果我为var_B执行的查找包含与var_A相同的结果,则为空。如果var_A为空或包含其他值,则可以将var_B分配给查找结果。

我想念什么?

1 个答案:

答案 0 :(得分:0)

问题部分

这里的问题是AnyLogic类型的getName()函数的行为。

我尝试了TargetLine类型(从getName()继承com.anylogic.engine.markup.AbstractMarkup),也尝试了RectangularShape(从getName()继承com.anylogic.engine.presentation.Shape),它们的行为都相同。

AnyLogic文档对getName()中的Shape进行了如下解释:

  

getName():如果形状在可显示的对象类(代理或实验)中声明为字段,例如如果是在图形编辑器中绘制的,则返回字段名称,否则返回字符串UNKNOWN_NAME。

TargetLine的{​​{1}}的解释与此类似。

意外的行为

getName()TargetLine的实例或其他AnyLogic特定类的实例分配给AnyLogic(!)变量(意味着在画布上以图形方式定义的变量)时,结果为RectangularShape将从在实例属性中在图形编辑器中定义的名称更改为为其分配的变量的名称。从现在起,您可以不再检索原始定义的名称,因为它已在内部更改为变量的名称。但是,实例仍然是相同的,只是getName()函数的返回值已更改。

以下是该行为的一个示例: AnyLogic GUI

getName()

这说明了为什么在将要搜索的列表成员的名称分配给AnyLogic变量后,为什么您的lambda表达式(以及使用traceln(rectangle.getName()); //prints "rectangle" myRectangle = rectangle; //assign to AnyLogic Variable traceln(rectangle.getName()); //prints "myRectangle" 函数的简单循环)无法按预期工作的原因。 / p>

可能的解决方法

  • 不将要搜索的对象分配给AnyLogic变量(可以使用正常的Java变量,效果很好)
  • 通过将这些信息存储在Java Map或类似物中并在按名称搜索实例时访问此资源来跟踪自己与名称实例配对的情况

结论

总而言之,AnyLogic文档应该具有的状态如下:

  

getName():如果形状在可显示的对象类(代理或实验)中声明为字段,例如如果是在图形编辑器中绘制的,则返回该字段的名称,否则返回字符串UNKNOWN_NAME。如果将形状分配给AnyLogic变量(在图形编辑器中绘制的变量),则返回此变量的名称。例如。运行代码getName()后,myVar = myShape;将返回 myVar 而不是 myShape