Поиск в списке, затем присвоение переменной возвращает ноль, если результат уже существует в другой переменной - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть две переменные и список, из которого я нахожу элементы, которые можно присвоить переменным:

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 голосов
/ 11 июня 2019

Проблемная часть

Проблема здесь заключается в поведении функций getName() типов AnyLogic.

Я пытался использовать тип TargetLine (наследующий getName() от com.anylogic.engine.markup.AbstractMarkup), но также и RectangularShape (наследующий getName() от com.anylogic.engine.presentation.Shape), и они оба вели себя одинаково.

Документация AnyLogic объясняет getName() из Shape следующим образом:

getName (): если форма объявлена ​​как поле в классе презентабельного объекта (агент или эксперимент), например, если онбыл нарисован в графическом редакторе, возвращает имя поля, в противном случае возвращает строку UNKNOWN_NAME.

Объяснение для TargetLine s getName() аналогично.

неожиданное поведение

Когда вы присваиваете экземпляр TargetLine или RectangularShape или экземпляры других определенных классов AnyLogic переменной AnyLogic (!) (имеется в виду переменная, которая графически определена на холсте), результатиз getName() изменится с имени, которое было определено в графическом редакторе в свойствах этого экземпляра, на имя переменной, которой он был назначен.С этого момента вы можете больше не получать первоначально определенное имя, так как оно было внутренне изменено на имя переменной.Однако экземпляр остается прежним, изменилось только возвращаемое значение функции getName().

Вот пример поведения: AnyLogic GUI

traceln(rectangle.getName()); //prints "rectangle"
myRectangle = rectangle;      //assign to AnyLogic Variable
traceln(rectangle.getName()); //prints "myRectangle"

Это объясняет, почему ваше лямбда-выражение (но также и простой цикл, использующий функцию getName()) не будет работать должным образом после того, как вы присвоили членам списка, который вы ищете, по их имени переменную AnyLogic.

Возможные обходные пути

  • не присваивание искомых объектов переменным AnyLogic (вы можете использовать обычные переменные Java, что отлично работает)
  • отслеживание сопряжения имя-экземплярсамостоятельно, храня эту информацию в Java Map или аналогичной и получая доступ к этому ресурсу при поиске экземпляров по имени

Заключение

Подводя итог, можно сказать, что ДОЛЖНА СОСТОЯНИЯ документации AnyLogicбыть более похожим на это:

getName (): если форма объявлена ​​как поле в классе презентабельного объекта (Agent или Experiment), например, если он был нарисован в графическом редакторе, возвращает имя поля, в противном случае возвращает строку UNKNOWN_NAME.Если форма присваивается переменной AnyLogic (переменная, нарисованная в графическом редакторе), вместо этого возвращается имя этой переменной.Например.после запуска кода myVar = myShape;, getName() вернет myVar вместо myShape .

...