Javaの8ストリームを使用してN配列の要素のSUM

クリスティアーノベルトリーニ:

私は、異なる長さのNのアレイを有することができます。重要なことは、私が持っていることができますどのように多くの配列を知らないということです。ちょうど3アレイと例を持ってみましょう:

Integer arr1[] = {5, 10, -5};
Integer arr2[] = {8, 3};
Integer arr3[] = {12, -1, 0, 9};

List<String> result = Arrays.stream(arr1)
        .flatMap(s1 -> Arrays.stream(arr2)
                .flatMap(s2 -> Arrays.stream(arr3)
                        .map(s3 -> s1 + s2 + s3)))
        .collect(Collectors.toList());

それは、ストリームを使用して、N配列のために、このようなことを行うことは可能ですか?

みんなここに。期待される結果ともう一つの例

 Integer arr1[] = {2, 4, 5};
 Integer arr2[] = {2, 4, 5};
 Integer arr3[] = {2 , 4, 5};

 List<Integer> result = Arrays.stream(arr1)
                .flatMap(s1 -> Arrays.stream(arr2)
                .flatMap(s2 -> Arrays.stream(arr3)
                .map(s3 -> s1 + s2 + s3))).sorted().collect(Collectors.toList());

                 System.out.println(" List of results: "+result);


              // List of results: [6, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13, 14, 14, 14, 15]
lczapski:

あなたは配列内のすべてのint型の合計をしたい場合は、次のように行うことができます。

int sumOfAll = Stream.of(arr1, arr2, arr3)
    .flatMap(Arrays::stream)
    .mapToInt(v -> v)
    .sum();

あなたが与えられた位置にint型の合計でリストをしたい場合は、次のように行うことができます。現在のリストが小さいのであれば、デフォルト値を挿入するためにそれを使用し、その後のアレイで最大の長さを計算します。

int max = Stream.of(arr1, arr2, arr3).mapToInt(a -> a.length).max().getAsInt();

List<Integer> reduce = Stream.of(arr1, arr2, arr3)
    .map(a -> Stream.of(a).collect(toList()))
    .reduce((a, b) -> IntStream.range(0, max)
        .mapToObj(i -> (i < a.size() ? a.get(i) : 0) + (i < b.size() ? b.get(i) : 0))
        .collect(toList()))
    .get();

更新

あなたは第二の例で示したものを達成したい場合、それは以下のように行うことができます。

  • 作成しList<List<Integer>>、加算に必要なすべてのint型を収集しています。
  • すべてのリストについては、加算操作を行います。
List<List<Integer>> integersList = Stream.of(arr11, arr12, arr13)
        .map(a -> Stream.of(a).map(x -> Arrays.asList(x)).collect(toList()))
        .reduce((a, b) -> b.stream().flatMap(v -> a.stream()
                        .map(x -> {
                                    ArrayList<Integer> ints = new ArrayList<>(x);
                                    ints.add(v.get(0));
                                    return ints;
                                }
                        )
                ).collect(toList())
        ).get();

それは与えます:

[2、2,2]、[4,2]、[2]、[5]、[2,2]、[2]、[4,2]、[4,4]、[2]、[5]、[4,2]、[ 2,5、2]、[4,5]、[2]、[5,5]、[2]、[2]、[2,4]、[4,2]、[4]、[5]、[2,4]、[2,1 4,4]、[4,4]、[4]、[5]、[4,4]、[2,5]、[4]、[4,5]、[4]、[5]、[5,4]、[2,2、 5]、[4,2]、[5]、[5]、[2,5]、[2,4]、[5]、[4,4]、[5]、[5、4、5]、[2,5]、[5] 、[4]、[5,5]、[5,5、5]

そして、それを合計します:

List<Integer> sum = integersList.stream()
        .map(a -> a.stream().reduce(Integer::sum).get())
        .sorted().collect(toList());

最終結果:

[6、8、8、8、9、9、9、10、10、10、11、11、11、11、11、11、12、12、12、12、13、13、13、14、14 、14、15]

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=394185&siteId=1