0

Суммировать все элементы в ArrayList на Java

16

Я столкнулся с проблемой при попытке сложить все элементы в списке ArrayList<Double>. У меня есть следующий код:

ArrayList<Double> m = new ArrayList<Double>();

Массив содержит значения типа Double, и мне нужно написать метод, который будет суммировать все эти элементы. Вот уже начальная часть метода:

public double incassoMargherita()
{
    double sum = 0;
    for(int i = 0; i < m.size(); i++)
    {          
    }
    return sum;
}

Не знаю, как правильно реализовать логику для сложения элементов внутри цикла for. Как мне добавить все значения из ArrayList и вернуть их сумму? Спасибо за помощь!

5 ответ(ов)

0

Есть два способа:

  1. Использовать индексы:
double sum = 0;
for (int i = 0; i < m.size(); i++)
    sum += m.get(i);
return sum;
  1. Использовать стиль "for each":
double sum = 0;
for (Double d : m)
    sum += d;
return sum;

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

0

Вы можете использовать Java 8 и выше для проще и удобнее выполнения суммирования значений различных типов, таких как Integer, Long, Double и Float, с использованием стримов. Вот пример кода, который иллюстрирует этот процесс:

List<Integer> ints = Arrays.asList(1, 2, 3, 4, 5);
List<Long> longs = Arrays.asList(1L, 2L, 3L, 4L, 5L);
List<Double> doubles = Arrays.asList(1.2d, 2.3d, 3.0d, 4.0d, 5.0d);
List<Float> floats = Arrays.asList(1.3f, 2.2f, 3.0f, 4.0f, 5.0f);

long intSum = ints.stream()
        .mapToLong(Integer::longValue)
        .sum();

long longSum = longs.stream()
        .mapToLong(Long::longValue)
        .sum();

double doublesSum = doubles.stream()
        .mapToDouble(Double::doubleValue)
        .sum();

double floatsSum = floats.stream()
        .mapToDouble(Float::doubleValue)
        .sum();

System.out.println(String.format(
        "Integers: %s, Longs: %s, Doubles: %s, Floats: %s",
        intSum, longSum, doublesSum, floatsSum));

В этом примере мы создаем списки чисел различных типов и затем применяем стримы для конвертации и суммирования этих значений. Метод mapToLong позволяет конвертировать Integer и Long значения, а mapToDouble — для Double и Float. В результате выполнения кода вы получите:

Integers: 15, Longs: 15, Doubles: 15.5, Floats: 15.5

Такой подход делает код более лаконичным и удобным для работы с коллекциями.

0

Ваша функция incassoMargherita() выглядит правильно и, хотя я не тестировал её, она должна работать. Она перебирает элементы списка m, накапливая их сумму в переменной sum, и в конце возвращает эту сумму. Однако, для повышения читаемости кода, я бы предложил использовать более современный подход, например, с использованием Java Streams, если ваша версия Java это поддерживает. Вот пример:

public double incassoMargherita() {
    return m.stream().mapToDouble(Double::doubleValue).sum();
}

Такой способ будет более лаконичным и выразительным. Тем не менее, ваша реализация тоже верна и должна правильно выполнять поставленную задачу.

0

Не слишком сложно, просто используйте m.get(i), чтобы получить значение из списка.

public double incassoMargherita()
{
    double sum = 0;
    for(int i = 0; i < m.size(); i++)
    {
        sum += m.get(i);
    }
    return sum;
}

В этом коде мы инициализируем переменную sum для подсчета общей суммы значений в списке m. Цикл for проходит по всем элементам списка, и в каждой итерации мы добавляем текущее значение к sum, используя m.get(i). В конце метода возвращается итоговая сумма.

0

Вы можете также воспользоваться мощью метода reduce из класса Stream. В Java 8 метод Stream.reduce() объединяет элементы потока и возвращает одно итоговое значение.

public double incassoMargherita()
{
    // reduce принимает 2 аргумента => 
    // 1. начальное значение
    // 2. бинарный оператор
    return m.stream().reduce(0, (a, b) -> a + b);
}

В этом примере мы используем метод reduce, чтобы суммировать все элементы потока m. Начальное значение равно 0, а бинарный оператор определяет, как именно складывать элементы между собой, в данном случае - просто суммируя их.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь