根据最大开票金额 拆分发票对象list 不满足最大开票金额进行合并,ID一致,超过最大开票金额,根据金额拆分成多个发票对象list,ID不同,来实现同ID发票对象开票金额合计小于等于最大开票金额
时间: 2023-08-19 09:04:55 浏览: 123
类似于上面的答案,我们可以遍历原始的List对象,然后根据最大开票金额对发票对象进行合并或拆分。如果累加金额超过最大开票金额,则根据每个发票对象的金额进行拆分,以确保同一ID的发票对象开票金额合计小于等于最大开票金额。下面是一个示例代码:
```java
public List<Invoice> splitInvoiceList(List<Invoice> invoiceList, int maxAmount) {
List<Invoice> result = new ArrayList<>();
int sum = 0;
List<Invoice> temp = new ArrayList<>();
int id = 1;
for (Invoice invoice : invoiceList) {
if (sum + invoice.getAmount() <= maxAmount) {
sum += invoice.getAmount();
invoice.setId(id);
temp.add(invoice);
} else {
int remaining = invoice.getAmount();
while (remaining > 0) {
int splitAmount = Math.min(remaining, maxAmount - sum);
Invoice splitInvoice = new Invoice();
splitInvoice.setId(id);
splitInvoice.setAmount(splitAmount);
temp.add(splitInvoice);
result.add(splitInvoice);
remaining -= splitAmount;
sum = 0;
id++;
}
if (remaining > 0) {
invoice.setId(id);
temp.add(invoice);
sum = remaining;
}
}
}
if (temp.size() > 0) {
result.addAll(temp);
}
return result;
}
```
在这个示例中,我们首先遍历了原始的List对象,并根据金额属性进行累加。如果累加金额小于等于最大开票金额,则将当前发票对象添加到temp列表中,并将sum累加上该发票对象的金额。同时,我们为每个发票对象设置一个ID属性,以便后续处理。如果累加金额超过最大开票金额,则根据每个发票对象的金额进行拆分,以确保同一ID的发票对象开票金额合计小于等于最大开票金额。具体来说,我们使用while循环不断将剩余金额拆分成新的发票对象,直到剩余金额为0为止。在拆分过程中,我们为每个新的发票对象设置一个新的ID属性,并将其添加到temp和result列表中。最后,我们返回result列表,其中包含了拆分后的多个发票对象列表。
请注意,这只是一个简单的示例代码,您可能需要根据实际需求进行调整。
阅读全文