Возможна ли сумма ArrayList
без зацикливания?
PHP предоставляет, sum(array)
который даст сумму массива.
Код PHP похож на
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\n";
Я хотел сделать то же самое на Java:
List tt = new ArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
ArrayList
нет чего-то «суммируемого»? ArrayList и массив - это не обязательно одно и то же. Что касается суммирования чисел в массиве, это очень простой цикл for по элементам и вычисление кумулятивной суммы.array_sum
также выполняет цикл внутри, она просто скрывает его от пользователя.Ответы:
однажды java-8отсутствует (март 2014 г.), вы сможете использовать потоки :
Если у тебя есть
List<Integer>
int sum = list.stream().mapToInt(Integer::intValue).sum();
Если это
int[]
int sum = IntStream.of(a).sum();
источник
map
неявно использует циклыТогда напишите сами:
public int sum(List<Integer> list) { int sum = 0; for (int i : list) sum = sum + i; return sum; }
источник
int
. Здесь мало смысла в использованииInteger
с функциями автоматической упаковки java. Кроме того, вы создаете и воссоздаете потенциально много новыхInteger
объектов каждый раз, поскольку этоImmutable
тип.Единственная альтернатива использованию цикла - использовать рекурсию.
Вы можете определить такой метод, как
public static int sum(List<Integer> ints) { return ints.isEmpty() ? 0 : ints.get(0) + ints.subList(1, ints.length()); }
Это очень неэффективно по сравнению с использованием простого цикла и может взорваться, если у вас много элементов в списке.
Альтернативой, позволяющей избежать переполнения стека, является использование.
public static int sum(List<Integer> ints) { int len = ints.size(); if (len == 0) return 0; if (len == 1) return ints.get(0); return sum(ints.subList(0, len/2)) + sum(ints.subList(len/2, len)); }
Это так же неэффективно, но позволит избежать переполнения стека.
Самый короткий способ написать то же самое -
int sum = 0, a[] = {2, 4, 6, 8}; for(int i: a) { sum += i; } System.out.println("sum(a) = " + sum);
печатает
sum(a) = 20
источник
Напишите служебную функцию вроде
public class ListUtil{ public static int sum(List<Integer> list){ if(list==null || list.size()<1) return 0; int sum = 0; for(Integer i: list) sum = sum+i; return sum; } }
Затем используйте как
int sum = ListUtil.sum(yourArrayList)
источник
для меня самый ясный способ таков:
или
Также используются внутренние петли, но без петель это невозможно.
источник
Вы можете использовать API общих коллекций apache.
class AggregateClosure implements org.apache.commons.collections.Closure { int total = 0; @Override public void execute(Object input) { if (input != null) { total += (Integer) input; } } public int getTotal() { return total; } }
Затем используйте это закрытие, как показано ниже:
public int aggregate(List<Integer> aList) { AggregateClosure closure = new AggregateClosure(); org.apache.commons.collections.CollectionUtils.forAllDo(aList, closure); return closure.getTotal(); }
источник
Если вы знаете о функции карты, то вы знаете, что карта также может быть рекурсивным циклом или рекурсивным циклом. Но, очевидно, для этого нужно дотянуться до каждого элемента. Итак, я не смог разработать Java 8 из-за некоторого несоответствия синтаксиса, но хотел очень короткого, так что это то, что я получил.
int sum = 0 for (Integer e : myList) sum += e;
источник
Учитывая, что список может содержать любой тип объекта, нет встроенного метода, который позволяет суммировать все элементы. Вы можете сделать что-то вроде этого:
int sum = 0; for( Integer i : ( ArrayList<Integer> )tt ) { sum += i; }
В качестве альтернативы вы можете создать свой собственный тип контейнера, который наследуется от ArrayList, но также реализует метод под названием sum (), который реализует приведенный выше код.
источник
ArrayList - это Коллекция элементов (в виде списка), примитивы хранятся как объект класса-оболочки, но в то же время я могу хранить и объекты класса String. СУММ в этом не имеет смысла. Кстати, почему все равно так боятся использовать цикл for (расширенный или через итератор)?
источник
Или переключитесь на Groovy, у него есть функция sum () для коллекции. [1,2,3,4,5,6] .sum ()
http://groovy.codehaus.org/JN1015-Collections
Работает на той же JVM, что и ваши классы Java.
источник
Java
, поэтому технически это не верный ответ.Эта ссылка показывает три разных способа суммирования в java, есть один вариант, которого нет в предыдущих ответах с использованием Apache Commons Math ..
Пример:
public static void main(String args []){ List<Double> NUMBERS_FOR_SUM = new ArrayList<Double>(){ { add(5D); add(3.2D); add(7D); } }; double[] arrayToSume = ArrayUtils.toPrimitive(NUMBERS_FOR_SUM .toArray(new Double[NUMBERS_FOR_SUM.size()])); System.out.println(StatUtils.sum(arrayToSume)); }
См. API StatUtils.
источник
Вы можете использовать библиотеку GNU Trove :
TIntList tt = new TIntArrayList(); tt.add(1); tt.add(2); tt.add(3); int sum = tt.sum();
источник
Это можно сделать с помощью reduce, используя ссылки на методы
reduce(Integer::sum)
:Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4) .stream() .reduce(Integer::sum) .get();
Или без
Optional
:Integer reduceSum = Arrays.asList(1, 3, 4, 6, 4) .stream() .reduce(0, Integer::sum);
источник