Подтвердить что ты не робот

Возможна ли сумма ArrayList без цикла

Возможно ли существование суммы 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);
4b9b3361

Ответ 1

Как только выйдет (март 2014 года), вы сможете использовать потоки:

Если у вас есть List<Integer>

int sum = list.stream().mapToInt(Integer::intValue).sum();

Если это int[]

int sum = IntStream.of(a).sum();

Ответ 2

Затем напишите сами:

public int sum(List<Integer> list) {
     int sum = 0; 

     for (int i : list)
         sum = sum + i;

     return sum;
}

Ответ 3

Напишите функцию утилиты, например

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)

Ответ 4

Единственной альтернативой использованию цикла является использование рекурсии.

Вы можете определить метод, например

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

Ответ 5

для меня самый ясный способ:

doubleList.stream().reduce((a,b)->a+b).get();

или

doubleList.parallelStream().reduce((a,b)->a+b).get();

Он также использует внутренние петли, но это невозможно без циклов.

Ответ 6

Вы можете использовать apache commons-collections API.

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();
}

Ответ 7

Если вы знаете о функции карты, то вы знаете, что карта также может быть рекурсивным циклом или рекурсивным циклом. Но, очевидно, вам нужно достичь каждого элемента для этого. поэтому я не смог обработать Java 8, потому что некоторая несогласованность синтаксиса, но очень хотела, так что это то, что я получил.

int sum = 0
for (Integer e : myList) sum += e;

Ответ 8

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

int sum = 0;

for( Integer i : ( ArrayList<Integer> )tt ) {
  sum += i;
}

В качестве альтернативы вы можете создать свой собственный тип контейнера, который наследуется от ArrayList, но также реализует метод sum(), который реализует указанный выше код.

Ответ 9

ArrayList - это Коллекция элементов (в виде списка), примитив хранится как объект класса-оболочки, но в то же время я могу хранить объекты класса String. SUM не имеет смысла в этом. Кстати, почему так страшно использовать в цикле (усиленный или через итератор) в любом случае?

Ответ 10

Эта ссылка показывает три разных способа суммирования в 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));

}

См. StatUtils api

Ответ 11

Вы можете использовать библиотеку GNU Trove:

TIntList tt = new TIntArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
int sum = tt.sum();

Ответ 12

Или переключитесь на Groovy, он имеет функцию sum() в коллекции. [1,2,3,4,5,6].sum()

http://groovy.codehaus.org/JN1015-Collections

Работает на той же JVM, что и ваши классы java.

Ответ 13

Как мы можем взять ввод времени выполнения для программы сбора?

пожалуйста, решите это написать программу для добавления элементов в массив, принимая входные данные во время выполнения?