在 AnyLogic 中,除了三种不同的代理群体/数据类型之外,我如何使用 findFirst 函数?

In AnyLogic, how can I use the findFirst function but for three different agent populations / data types?

问题: 有没有办法编写一个函数来解释不同的数据类型? 泛型是否有效?如果有效,您如何在 AnyLogic 中做到这一点?

背景: 我有三种不同的代理类型,它们继承自父 class。

继承/扩展自“agentA”的“agentB”、“agentC”和“agentD”。 它们都有相同的变量“condition1”和“condition2”。

此外,我使用数据库表创建了上述代理的群体(主要)。

“popB”、“popC”和“popD”

我正在使用 findFirst() 函数查找满足要求条件的第一个对象。 为了考虑到不同的类型,我写了 3 个不同的函数,除了类型之外都是相同的。

代码示例:

AgentB 类型的函数:

AgentB curAgent = null;

curAgent = findFirst(main.popB, p->p.condition1 == true && p.condition2 == true);

return curAgent;

AgentC 类型的函数:

AgentC curAgent = null;

curAgent = findFirst(main.popC, p->p.condition1 == true && p.condition2 == true);

return curAgent;

AgentD 类型的函数:

AgentD curAgent = null;

curAgent = findFirst(main.popD, p->p.condition1 == true && p.condition2 == true);

return curAgent;

你说它们都有相同的变量“condition1”和“condition2”。

如果是这样,那么您的解决方案就很简单了。

import java.util.Collection;
import java.util.List;

public class SOQ_20220430
{

   class AgentA
   {
   
      public final boolean condition1;
      public final boolean condition2;
      
      /** Potentially other fields. */
      
      public AgentA(boolean condition1, boolean condition2)
      {
      
         this.condition1 = condition1;
         this.condition2 = condition2;
      
      }
      
      public boolean bothTrue()
      {
      
         return condition1 && condition2;
      
      }
      
      public String toString()
      {
      
         return
            this.getClass().getName() 
               + "{ condition1 = " + this.condition1
               + ", condition2 = " + this.condition2 + "}";
      
      }
      
      /** Potentially other methods. */
   
   }
   
   class AgentB extends AgentA { 
      public AgentB(boolean c1, boolean c2) { super(c1, c2); }
   }
   
   class AgentC extends AgentA { 
      public AgentC(boolean c1, boolean c2) { super(c1, c2); }
   }
   
   class AgentD extends AgentA { 
      public AgentD(boolean c1, boolean c2) { super(c1, c2); }
   }
   
   public SOQ_20220430()
   {
   
      final List<AgentB> popB = List.of(new AgentB(false, false), new AgentB(true, true));
      final List<AgentC> popC = List.of(new AgentC(false, false), new AgentC(true, true));
      final List<AgentD> popD = List.of(new AgentD(false, false), new AgentD(true, true));
      
      System.out.println(findFirst(popB));
      System.out.println(findFirst(popC));
      System.out.println(findFirst(popD));
   
   }
   
   public <T extends AgentA> T findFirst(Collection<T> popT)
   {
   
      for (T each : popT)
      {
      
         if (each.bothTrue())
         {
         
            return each;
         
         }
      
      }
   
      throw new IllegalStateException("Couldn't find one!");
   
   }
   
   public static void main(String[] args)
   {
   
      new SOQ_20220430();
   
   }

}

由于它们都扩展了 AgentA,因此 AgentA 中的任何字段或函数也都可以使用。因此,只要我们调用超级构造函数,我们就可以检查它们是否为真,正如您在每个子 类.

中看到的那样

然后,我们需要做的就是接受 findFirst 任何类型相同并扩展 AgentA.

的元素集合作为参数