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ループなしの合計の可能性はありますか?
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);
array_sumも内部でループを実行し、ユーザーからループを非表示にします。
回答:
次に、自分で書きます。
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
次のようなutil関数を記述します
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)
apache commons-collectionsAPIを使用できます。
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();
}
map関数について知っている場合は、マップが再帰ループまたは再帰ループになることもあることを知っています。しかし、明らかにそのためには各要素に到達する必要があります。そのため、構文の不一致があったため、Java 8を解決できませんでしたが、非常に短いものが必要だったため、これが得られました。
int sum = 0
for (Integer e : myList) sum += e;
または、Groovyに切り替えると、コレクションにsum()関数があります。[1,2,3,4,5,6] .sum()
http://groovy.codehaus.org/JN1015-コレクション
Javaクラスと同じJVMで実行されます。
Javaため、これは技術的には有効な回答ではありません。
このリンクは、Javaで合計する3つの異なる方法を示しています。ApacheCommonsMathを使用した以前の回答にはないオプションが1つあります。
例:
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
ArrayList「合計可能」なものが含まれていない場合はどうなりますか?ArrayListと配列は必ずしも同じものではありません。配列内の数値の合計に関しては、要素のループと累積合計の計算は非常に簡単です。