сложение значения массива с другим массивом - PullRequest
0 голосов
/ 04 февраля 2020

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

[{"_id":"5e154cf38c52231ee19f8",
  "refunds":[
    {"_id":"5e38f10a754fcf3d48015",
     "reason":"refund 1",
     "amount":50000,
     ]},
 {"_id":"5e1578b48c52231ee19f8",
  "refunds":[
    {"_id":"5e37e09ef9ea5e3784043",
     "reason":"refund 1",
     "amount":100000,
    {"_id":"5e37e12a02c27c14580a1",
     "reason":"refund 2",
     "amount":100000,
    {"_id":"5e38f02b754fcf3d48015",
     "reason":"refund 3",
     "amount":50000,
     ]},
  {"_id":"5e1578b48c52231ee19f8",
   "refunds":[]
}]

Я надеюсь получить res = 300000

Ответы [ 2 ]

0 голосов
/ 04 февраля 2020

Прежде чем ответить ... Я предполагаю, что 2 вещи -

1-й - вы ищете ответ в Java. 2-й - И вы можете сделать вещи намного проще, используя java Список:

Пусть мы сделаем 2 класса Refund & Composite (Содержит список) -

Класс возврата -

package com.sabre.ticketing.dhs.service.create.domain;

public class Refund {

    String _id;
    String reason;
    int    amount;

    public Refund(String _id, String reason, int amount) {
        this._id = _id;
        this.reason = reason;
        this.amount = amount;
    }


    public int getAmount() {
        return amount;
    }

}

А вот и составной класс как -

package com.sabre.ticketing.dhs.service.create.domain;

import java.util.List;

public class Composite {

    String _id;
    List<Refund> refunds;

    public Composite(String _id, List<Refund> refunds) {
        this._id = _id;
        this.refunds = refunds;
    }

    public List<Refund> getRefunds() {
        return refunds;
    }
}

Техника вычислений в SumCal c класс -

package com.sabre.ticketing.dhs.service.create.domain;

import java.util.ArrayList;
import java.util.List;

public class SumCalc {

    public static void main(String[] args){

        List<Composite> composites = List.of(new Composite("5e154cf38c52231ee19f8", List.of(new Refund("5e38f10a754fcf3d48015", "refund 1", 50000))),
                new Composite("5e154cf38c52231ee19f8",
                        List.of(new Refund("5e37e09ef9ea5e3784043", "refund 1", 100000),
                                new Refund("5e37e12a02c27c14580a1", "refund 2", 100000),
                                new Refund("5e38f02b754fcf3d48015", "refund 3", 50000))),
                new Composite("5e154cf38c52231ee19f8", new ArrayList<>()));
        // Basically get you Json converted into composites list.. for simplicity and dont want to jackson thing i have initialized list  as new ..

        Integer finalSum = composites.stream()
                .map(Composite::getRefunds)
                .flatMap(List::stream)
                .map(Refund::getAmount)
                .reduce((sum, val) -> sum + val)
                .orElse(0);

        System.out.println("final Sum is " + finalSum);

        }

}

Запуск SumCla c ...


окончательная сумма 300000

Процесс завершен с кодом выхода 0

0 голосов
/ 04 февраля 2020

Это должно быть относительно просто, мы создадим плоский массив всех объектов возврата, используя flatMap , затем мы будем использовать уменьшение для суммирования общей суммы.

Я добавил еще одну функцию sumRefundAmountsII для обхода JavaScript сред, которые не поддерживают.flatMap (до ES2019)

const data = [ { "_id": "5e154cf38c52231ee19f8", "refunds": [ { "_id": "5e38f10a754fcf3d48015", "reason": "refund 1", "amount": 50000 } ] }, { "_id": "5e1578b48c52231ee19f8", "refunds": [ { "_id": "5e37e09ef9ea5e3784043", "reason": "refund 1", "amount": 100000 }, { "_id": "5e37e12a02c27c14580a1", "reason": "refund 2", "amount": 100000 }, { "_id": "5e38f02b754fcf3d48015", "reason": "refund 3", "amount": 50000 } ] }, { "_id": "5e1578b48c52231ee19f8", "refunds": [] }];

function sumRefundAmounts(array) {
    // Get an array of all refunds.
    const refunds = array.flatMap(obj => obj.refunds);
    // Sum amount for each refund.
    return refunds.reduce((sum, refund) => { 
        return sum + refund.amount;
    }, 0);
}

console.log("Total amount:", sumRefundAmounts(data));

// Use this function if your JavaScript environment complains about .flatMap
function sumRefundAmountsII(array) {
    // Use a work around if we don't have flatMap... 
    const refunds = [].concat.apply([], array.map(obj => obj.refunds));
    // Sum amount for each refund.
    return refunds.reduce((sum, refund) => { 
        return sum + refund.amount;
    }, 0);
}

console.log("Total amount (no flat map):", sumRefundAmountsII(data));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...