Java。对Java对象集合中的精确值进行分组和求和

aa,这终于发生了,我寻求帮助:(

开始吧: 我有一个传入交易的列表,例如:

List<FinancialTransaction> incomingTransactions = new ArrayList();
incomingTransactions.add(new FinancialTransaction(1, 1, 2, 1000000));
incomingTransactions.add(new FinancialTransaction(2, 1, 2, 2000000));
incomingTransactions.add(new FinancialTransaction(3, 2, 1, 1000000));
incomingTransactions.add(new FinancialTransaction(4, 2, 1, 4000000));
incomingTransactions.add(new FinancialTransaction(5, 2, 3, 1000000));

FinancialTransaction POJO:

public class FinancialTransaction {

    private Integer id;

    private Integer srcId;

    private Integer dstId;

    private Long amount;

    public Integer getId() {
        return id;
    }

    //getters, setters, constructors, toString
}

然后,incomingTransactions移至下面列出的方法,该方法必须创建一个新Map,其键为FinancialTransaction的srcId和dstId,按此键分组,将分组对象的“ amount”值相加,然后将Id = sdcId和dstId放入新对象, srcId = this.srcId,dstId = this.dstId,amount =所有分组对象的总和:

public class TransactionMerger {


    public static Map<String, FinancialTransaction> mergeTransactions(List<FinancialTransaction> financialTransactions) {

        Map<String, FinancialTransaction> mergedTransactions = new HashMap<>();

        for (FinancialTransaction ft: financialTransactions) {

            String key = ft.getSrcId() + "" + ft.getDstId();

            if (mergedTransactions.get(key) != null) {
                mergedTransactions.put(key, ft);
            } else {
//          Don't know to write here :/
            }

        }

        financialTransactions.clear();

        return mergedTransactions;
    }

}

此方法必须吸收incomingTransactions返回类似以下内容的方法:

Key: 12 Value: FinancialTransaction {12, 1, 2, 3000000} //summed first and second values in incoming list
Key: 21 Value: FinancialTransaction {21, 2, 1, 5000000} //summed third and fourth values in incoming list
Key: 23 Value: FinancialTransaction {23, 2, 3, 1000000} //returned fifth values

请帮助我没有主意,我已经知道如何使用多个值对组合键进行分组,但是总和分组-没有主意请帮忙!!!!

大家伙!

评论
吥稀罕
吥稀罕
public static Map<String, FinancialTransaction> mergeTransactions(List<FinancialTransaction> financialTransactions) {

        Map<String, FinancialTransaction> mergedTransactions = new HashMap<>();

        for (FinancialTransaction ft: financialTransactions) {

            String key = ft.getSrcId() + "" + ft.getDstId();

            if (mergedTransactions.containsKey(key)) {
                //get the existing FinancialTransaction for the key and updates it's amount only
                mergedTransactions.get(key).setAmount(mergedTransactions.get(key).getAmount() + ft.getAmount());
            } else {
                //create new FinancialTransaction object for the map
                FinancialTransaction financialTransaction = new FinancialTransaction();
                //do not set Id for the new object, as its not db generated, key will behave like id
                financialTransaction.setSrcId(ft.getSrcId());
                financialTransaction.setDstId(ft.getDstId());
                financialTransaction.setAmount(ft.getAmount());
                mergedTransactions.put(key, financialTransaction);
            }
        }

        financialTransactions.clear();
        return mergedTransactions;
    }

希望这可以帮助。我添加了评论,让我知道是否需要进一步说明。

点赞
评论
hehe
hehe

First, you have to create merge function in your FinancialTransactionor in utility. for now, I'm adding in the above class.

public static FinancialTransaction merge(FinancialTransaction first, FinancialTransaction second){
  first.setAmount(first.getAmount() + second.getAmount());
  return first;
}

And now , let's group using map.merge

incomingTransactions.stream()
  .collect(Collectors.toMap(trxn -> trxn.getSrcId() + "" + trxn.getDstId(), Function.identity() , FinancialTransaction::merge));

在这里,分组将使用生成的密钥完成,当我们遇到重复的密钥(或类似的交易)时,它将应用合并功能,该功能基本上将求和并返回金融交易的更新参考。

注意:如注释中所指出,请小心如何生成用于分组的密钥。

点赞
评论