在 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
.
的元素集合作为参数
问题: 有没有办法编写一个函数来解释不同的数据类型? 泛型是否有效?如果有效,您如何在 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
.