List元素的深度复制和递归- java

fivyi3re  于 2023-03-11  发布在  Java
关注(0)|答案(2)|浏览(125)

我有一个Trade类,它有3个参数(amountdescriptiondate)。每个交易的amount不能大于maxAmount
我有许多交易保存在ListToSend中,其中一些金额超过了maxAmount限制,所以我需要在发送列表之前将这些交易拆分为多个交易。
我考虑过使用两个列表,一个是原始的ListToSend列表,另一个是tradesToSplit列表。
1.将每个splitableTradeListToSend移动到tradesToSplit

  • 然后我想循环tradesToSplit,对于其中的每笔交易:
  • 我调用一个recursiveMethod,它将把这个数除以2,然后:
  • 如果amount/2不大于maxAmount
  • 然后我创建了一个newTrade,它本质上是初始交易的深度副本,我将newTrade的金额设置为originalAmount/2
  • 如果没有,我会调用recursiveMethod来继续除以该金额

但是我被困在这里,因为我不知道如何编辑经过多次迭代的recursiveMethod原始交易。
有没有更好的方法来实现我想做的事情?

ylamdve6

ylamdve61#

在OOP中,推荐保持对象不变,因为不变对象本质上是线程安全的,更容易调试(你可以共享对象引用而不用担心意外的或未授权的改变),等等。
在你的例子中,我将创建一个函数splitTrade,它将接受任何amount的交易,并返回一个交易列表,其中每个amount小于maxAmount
下面是一些伪java代码:

private List<Trade> splitTrade(Trade trade, List<Trade> acc) {
  if (trade.getAmount() > Trade.MAX_AMOUNT) {
    Trade trade1 = new Trade(Trade.MAX_AMOUNT, trade.getDescription(), trade.getDate());
    Trade trade2 = new Trade(trade.getAmount() - Trade.MAX_AMOUNT, trade.getDescription(), trade.getDate());
    acc.add(trade1);
    return splitTrade(trade2, acc);
  } else {
    acc.add(trade);
    return acc;
  }
}

public List<Trade> splitAllTrades(List<Trade> listToSend) {
  return listToSend.stream().flatMap((t) -> splitTrade(t, new ArrayList<Trade>()).stream().toList();
}

不使用lambda语法:

public List<Trade> splitAllTrades(List<Trade> listToSend) {
  List<Trade> validTrades = new ArrayList<>();
  for (Trade trade: listToSend) {    
    validTrades.addAll(splitTrade(trade, new ArrayList<Trade>()));
  }
  return validTrades;
}
lstz6jyr

lstz6jyr2#

一个可能的解决方案是在Trade中使用一个方法,生成满足以下条件的交易流:

public class Trade {
    ...
    public Stream<Trade> streamLegalTrades() {
        if (amount < maxAmount)
            return Stream.of(this);

        Trade halfTrade = new Trade(amount / 2, ...);
        return Stream.of(halfTrade, halfTrade)
            .flatMap(Trade::streamLegalTrades);
    }
}

如果你不熟悉交易流,那么这个语句可能会有点混乱,但它本质上产生了2个新的交易,然后为每个交易产生了一个法律的的交易流。
这就使得转换你的交易列表变得很简单:

tradeList.stream().flatMap(Trade::streamLegalTrades).toList();

相关问题