用特定数量的元素将ArrayList分成较小的ArrayList

时间:2018-08-31 21:31:33

标签: java arraylist

我不是程序员。我在仓库工作,我想使我的工作更轻松。我的职责之一是将超过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行。

我不知道。有什么建议吗?

2 个答案:

答案 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
    }