我不是程序员。我在仓库工作,我想使我的工作更轻松。我的职责之一是将超过2000行的excel文件分成较小的行,然后将它们发送出去。我手动执行此操作,并且我想创建一个为我执行此操作的程序。
我设法从excel读取数据。每行都放入Item数据结构中。并将它们全部放入ArrayList。
public class Item{
String ean;
int amount;
}
这是我的问题。
我有一个带有2000多个元素的ArrayList。每个元素都有字符串名称和整数值。
我必须将其分成较小的ArrayList,但条件是item.getAmount()的总数不能超过800;
int totalAmount = 0;
int counter = 1;
List<Item> temp = new ArrayList<>();
for (Itema item: items) {
totalAmount += item.getAmount();
if (totalAmount <= 800) {
temp.add(item);
}
if (counter == items.size()) {
createFile(temp);
temp.clear();
}
if (totalAmount > 800) {
createFile(temp);
temp.clear();
temp.add(item);
totalAmount = 0;
}
counter++;
}
当我使用ArrayList运行此列表时,该列表包含30个项,每个项的数量为100。它创建4个excel文件。前三个只有1行,第四个只有4行。
我不知道。有什么建议吗?
答案 0 :(得分:3)
我发现不容易将其添加到列表中,然后将其清除,而只是通过标识不超过目标总和(*)的子列表的开头和结尾来考虑它:
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。您不能用这种情况做任何事情,只能自己写。
答案 1 :(得分:1)
对于产生长度为8、9、9、4的修订代码的子列表而言,问题在于将当前子列表刷新到文件后,您错误地重置了totalAmount
,没有考虑到该项目您正在处理中。最后,temp
包含一个元素,但totalAmount
为零。
要使totalAmount
反映临时项目中amount
的正确总和,该替代方案应更像这样:
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
}