AnyLogic:计算集合中所有值的总和

时间:2017-11-13 12:57:51

标签: java collections simulation anylogic agent-based-modeling

我有一个基于代理的模拟,我有一个名为collection_dailyInfection的集合,其中包含每天出现的新感染数量。该集合看起来有点像这样:

  • 第1天:0
  • 第2天:3
  • 第4天:3
  • 第5天:6
  • 第6天:1
  • 。 。

我现在正在尝试编写一个能够累计任何特定日期感染总数的函数。例如:在第6天 - 总感染= 0 + 3 + 3 + 6 + 1 = 13.

计算总和的语法是: double sum( collection, value ) - 返回给定集合中值的总和。

对于我的特定示例,这将是double sum( collection_dailyInfection, *value*),但我不确定我应该在'值'论点。有人可以帮帮我吗?

2 个答案:

答案 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; 
    }


}