Java 将ArrayList划分为具有特定元素量的较小ArrayList
我不是程序员。我在仓库工作,我想让我的工作更轻松。我的职责之一是将超过2000行的excel文件分成更小的行并发送出去。我手工做,我想创建一个程序,为我这样做 我已设法从excel中读取数据。每一行都被放入一个项目数据结构中。所有这些都被放入ArrayListJava 将ArrayList划分为具有特定元素量的较小ArrayList,java,arraylist,Java,Arraylist,我不是程序员。我在仓库工作,我想让我的工作更轻松。我的职责之一是将超过2000行的excel文件分成更小的行并发送出去。我手工做,我想创建一个程序,为我这样做 我已设法从excel中读取数据。每一行都被放入一个项目数据结构中。所有这些都被放入ArrayList public class Item{ String ean; int amount; } 这是我的问题 我有一个包含2000多个元素的ArrayList。每个元素都有字符串名和int amount 我必须将其划分为更小的
public class Item{
String ean;
int amount;
}
这是我的问题
我有一个包含2000多个元素的ArrayList。每个元素都有字符串名和int amount
我必须将其划分为更小的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++;
}
int totalAmount=0;
int计数器=1;
List temp=new ArrayList();
对于(项A项:项){
totalAmount+=item.getAmount();
如果(合计金额800){
创建文件(临时文件);
温度清除();
临时添加(项目);
总数=0;
}
计数器++;
}
当我使用ArrayList运行这个程序时,它包含30个项目,每个项目的金额为100。它创建了4个excel文件。前三个只有一行,第四个只有4行
我想不出来。任何建议???关于修改后的代码生成长度为8、9、9、4的子列表,问题是在将当前子列表刷新为文件后,您错误地重置了
总金额,而没有考虑您当前正在处理的项目。结果是temp
包含一个元素,但totalAmount
为零
要使totalAmount
反映temp中项目的amount
s的正确总和,该备选方案应如下所示:
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
}
我发现,更容易的做法是,不要将内容添加到列表中,然后再将其清除,而只是确定不超过目标总和(*)的子列表的开始和结束:
int start=0;
while(开始800){
打破
}
合计金额+=金额;
end++;
}
//现在在开始和结束之间刷新子列表:
createFile(items.subList(start,end));
//现在继续下一步。
开始=结束;
}
(*)您可能会得到一个超过总和的单元素子列表,例如,如果金额为801。除了自己编写外,您不能对该案例执行任何操作。在createFile
中使用temp
后,您不应该清除它吗?你正在删除列表,向其中添加一个元素,然后使用删除的列表创建一个文件。dupe闭包不是我说你的问题不好,而是我说你的答案在另一座城堡里。我想不出比另一个答案更好的方法了。@Makoto这不是同一个问题。大多数答案在这里都是不相关的。@Makoto,要求似乎是每个子列表中项
s的金额
属性的值之和不超过800。这与子列表的大小无关。应该totalAmount=0
betotalAmount=item.getAmount()代码>?这一个工作,我非常感谢你和其他人谁回答了这个线程。这样我的工作就不会那么烦人了。请允许我再问一个问题。如果我希望每个文件最多有8行,该怎么办?将while循环中的条件更改为end
。
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;
}