为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

小怪兽爱吃肉 2021-08-25 10:26:13
我不是程序员。我在仓库工作,我想让我的工作更轻松。我的职责之一是将超过 2000 行的 excel 文件分成更小的文件并发送出去。我手动完成,我想创建一个程序来为我做这件事。我已经设法从excel中读取数据。每行都放入一个 Item 数据结构中。并且所有这些都被放入ArrayList。public class Item{    String ean;    int amount;}这是我的问题。我有一个包含 2000 多个元素的 ArrayList。每个元素都有字符串名称和整数数量。我必须把它分成更小的 ArrayLists 但条件是 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 运行它时,该 ArrayList 包含 30 个项目,每个项目的数量为 100。它创建了 4 个 excel 文件。前三个只有 1 行,第四个有 4 行。我想不通。有什么建议吗??
查看完整描述

2 回答

?
开心每一天1111

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。除了自己编写之外,您无法对这种情况做任何事情。


查看完整回答
反对 回复 2021-08-25
?
肥皂起泡泡

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

    }


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信