Ответ 1
Как только java-8 выйдет (март 2014 года), вы сможете использовать потоки:
Если у вас есть List<Integer>
int sum = list.stream().mapToInt(Integer::intValue).sum();
Если это int[]
int sum = IntStream.of(a).sum();
Возможно ли существование суммы 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);
Как только java-8 выйдет (март 2014 года), вы сможете использовать потоки:
Если у вас есть List<Integer>
int sum = list.stream().mapToInt(Integer::intValue).sum();
Если это int[]
int sum = IntStream.of(a).sum();
Затем напишите сами:
public int sum(List<Integer> list) {
int sum = 0;
for (int i : list)
sum = sum + i;
return sum;
}
Напишите функцию утилиты, например
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)
Единственной альтернативой использованию цикла является использование рекурсии.
Вы можете определить метод, например
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
для меня самый ясный способ:
doubleList.stream().reduce((a,b)->a+b).get();
или
doubleList.parallelStream().reduce((a,b)->a+b).get();
Он также использует внутренние петли, но это невозможно без циклов.
Вы можете использовать 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();
}
Если вы знаете о функции карты, то вы знаете, что карта также может быть рекурсивным циклом или рекурсивным циклом. Но, очевидно, вам нужно достичь каждого элемента для этого. поэтому я не смог обработать 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. SUM не имеет смысла в этом. Кстати, почему так страшно использовать в цикле (усиленный или через итератор) в любом случае?
Пример:
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
Вы можете использовать библиотеку GNU Trove:
TIntList tt = new TIntArrayList();
tt.add(1);
tt.add(2);
tt.add(3);
int sum = tt.sum();
Или переключитесь на Groovy, он имеет функцию sum() в коллекции. [1,2,3,4,5,6].sum()
http://groovy.codehaus.org/JN1015-Collections
Работает на той же JVM, что и ваши классы java.
Как мы можем взять ввод времени выполнения для программы сбора?
пожалуйста, решите это написать программу для добавления элементов в массив, принимая входные данные во время выполнения?