Java 将ArrayList划分为具有特定元素量的较小ArrayList

Java 将ArrayList划分为具有特定元素量的较小ArrayList,java,arraylist,Java,Arraylist,我不是程序员。我在仓库工作,我想让我的工作更轻松。我的职责之一是将超过2000行的excel文件分成更小的行并发送出去。我手工做,我想创建一个程序,为我这样做 我已设法从excel中读取数据。每一行都被放入一个项目数据结构中。所有这些都被放入ArrayList public class Item{ String ean; int amount; } 这是我的问题 我有一个包含2000多个元素的ArrayList。每个元素都有字符串名和int amount 我必须将其划分为更小的

我不是程序员。我在仓库工作,我想让我的工作更轻松。我的职责之一是将超过2000行的excel文件分成更小的行并发送出去。我手工做,我想创建一个程序,为我这样做

我已设法从excel中读取数据。每一行都被放入一个项目数据结构中。所有这些都被放入ArrayList

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
be
totalAmount=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;
}