2 回答
TA贡献1836条经验 获得超13个赞
我发现更容易不考虑将内容添加到列表中,然后将其清除,而只需识别不超过目标总和 (*) 的子列表的开始和结束:
int start = 0;
while (start < items.size()) {
// Move the end pointer until your total exceeds 800.
int end = start + 1;
int totalAmount = items.get(start).getAmount();
while (end < items.size()) {
int amount = items.get(end).getAmount();
if (totalAmount + amount > 800) {
break;
}
totalAmount += amount;
end++;
}
// Now flush the sublist between start and end:
createFile(items.subList(start, end));
// Now move on to the next.
start = end;
}
(*) 您可能会得到一个超过总和的单元素子列表,例如,如果数量为 801。除了自己编写之外,您无法对这种情况做任何事情。
TA贡献1829条经验 获得超6个赞
关于生成长度为 8、9、9、4 的子列表的修订代码,问题是在将当前子列表刷新到文件后,您totalAmount错误地重置了,没有考虑您当前正在处理的项目。您最终temp包含一个元素,但totalAmount为零。
为了totalAmount反映amounttemp 中项目的正确总和,该替代方案应该更像这样:
if (totalAmount > 800) {
createFile(temp);
temp.clear();
temp.add(item); // temp now contains one element
totalAmount = item.getAmount(); // this is the 'amount' of that element
}
添加回答
举报