我有一个基于代理的模拟,我有一个名为collection_dailyInfection
的集合,其中包含每天出现的新感染数量。该集合看起来有点像这样:
我现在正在尝试编写一个能够累计任何特定日期感染总数的函数。例如:在第6天 - 总感染= 0 + 3 + 3 + 6 + 1 = 13.
计算总和的语法是:
double sum( collection, value )
- 返回给定集合中值的总和。
对于我的特定示例,这将是double sum( collection_dailyInfection, *value*)
,但我不确定我应该在'值'论点。有人可以帮帮我吗?
答案 0 :(得分:1)
AnyLogic提供的用于计算集合统计信息的这些函数(方法)使用了Java的一个相当高级的特性:Java 8中添加的函数式编程。因此所需的语法并不明显。主要帮助页面( AnyLogic帮助 - >参数,变量,集合 - >集合 - >用于收集集合统计信息的函数)包含指向UtilitiesCollection
的链接定义这些方法的类。
您有每天感染次数的集合collection_dailyInfection
;假设您在AnyLogic中将此指定为集合类ArrayList
,其元素类为int
,并且您使用循环事件在每个模拟日添加计数。
因此,你的总和表达式应为
sum( collection_dailyInfection, c -> c.doubleValue())
c
只是sum所在的当前元素的任意标识符(实际上这个sum方法循环遍历您的集合),->
是一个特殊的Java 8函数编程运算符。在AnyLogic中为集合内容指定类型int
时,它们实际上存储为Integer
对象,这些对象是int
基元的对象版本。 (请参阅任何Java教科书以了解这一点。)
因此,每个条目(Integer
对象)都有一个方法doubleValue
,它将整数的值作为double返回。 (AnyLogic的sum
函数需要'value'位为double
;即实数(浮点)数。)
(anupam691997的答案是忽略AnyLogic环境的'纯Java'解决方案。)
答案 1 :(得分:0)
值应该是一个整数,它将表示您希望感染总数的那一天。
例如,在这种情况下,值的值应为6.因为您想要感染总数直到第6天。
以下是您想要的工作演示
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static void main (String[] args) throws java.lang.Exception
{
ArrayList<Integer> list;
Scanner sc=new Scanner(System.in);
list=new ArrayList<Integer>(); /* this list will hold all the values*/
int total=sc.nextInt(); /* total number of values in the list */
int value=sc.nextInt(); /* the day till which you want the total infection */
for(int i=0;i<total;i++) /*taking input in the list */
list.add(sc.nextInt());
double sum=calculateSum(list,value); /* function to compute sum*/
System.out.println(sum);
}
static double calculateSum(ArrayList<Integer> list,int value)
{
double sum=0.0;
for(int j=0;j<value;j++) /* calculates sum from day 1 till value*/
sum=sum+list.get(j);
return sum;
}
}