AnyLogic: Вычисление суммы всех значений в коллекции

У меня есть симуляция на основе агента, где у меня есть коллекция под названием 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*), но я не уверен, что мне следует указать в аргументе «значение». Может кто-нибудь помочь мне, пожалуйста?


person crabcanon    schedule 13.11.2017    source источник
comment
Какие другие звонки в порядке? Может быть, double sum( collection, key ) (имеется в виду, что ключи должны быть суммированы)? Если это так, то это имеет смысл.   -  person Stefan    schedule 13.11.2017
comment
Не могли бы вы показать (частично) работающую программу, это может помочь определить правильное решение.   -  person achAmháin    schedule 13.11.2017


Ответы (2)


Эти функции (методы), предоставляемые AnyLogic для расчета статистики по коллекциям, используют довольно продвинутую особенность Java: элементы функционального программирования, добавленные в Java 8. Таким образом, требуемый синтаксис совсем не очевиден. На главной странице справки (Справка AnyLogic --> Параметры, переменные, коллекции --> Коллекции --> Функции для сбора статистики по коллекции) есть ссылка на класс UtilitiesCollection, в котором определены эти методы.

У вас есть коллекция collection_dailyInfection ежедневных данных о заражении; давайте предположим, что вы указали это в AnyLogic как относящийся к классу коллекции ArrayList с классом элементов как int, и вы использовали циклическое событие для добавления счетчика каждый смоделированный день.

Таким образом, ваше выражение суммы должно быть

sum( collection_dailyInfection, c -> c.doubleValue())

c — это просто произвольный идентификатор текущего элемента, в котором находится сумма (по сути, этот метод суммы проходит через вашу коллекцию), а -> — это специальный оператор функционального программирования Java 8. Когда вы указываете тип int в AnyLogic для содержимого вашей коллекции, они фактически сохраняются как объекты Integer, которые являются объектными версиями примитивов int. (См. любой учебник по Java, чтобы понять это.)

Таким образом, каждая запись (объект Integer) имеет метод doubleValue, который возвращает значение целого числа как двойное. (Функция AnyLogic sum требует, чтобы бит «значение» был double, т. е. действительным числом (с плавающей запятой).)

(Ответ anupam691997 - это решение «чистой Java», игнорирующее контекст AnyLogic.)

person Stuart Rossiter    schedule 14.11.2017

Значение должно быть целым числом. Оно будет обозначать тот день, до которого вы хотите получить общее количество заражений.

Например, в этом случае значение value должно быть равно 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; 
    }


}
person anupam691997    schedule 13.11.2017