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

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


我想不通。有什么建议吗??


小怪兽爱吃肉
浏览 142回答 2
2回答

开心每一天1111

我发现更容易不考虑将内容添加到列表中,然后将其清除,而只需识别不超过目标总和 (*) 的子列表的开始和结束:int start = 0;while (start < items.size()) {&nbsp; // Move the end pointer until your total exceeds 800.&nbsp; int end = start + 1;&nbsp; int totalAmount = items.get(start).getAmount();&nbsp; while (end < items.size()) {&nbsp; &nbsp; int amount = items.get(end).getAmount();&nbsp; &nbsp; if (totalAmount + amount > 800) {&nbsp; &nbsp; &nbsp; break;&nbsp; &nbsp; }&nbsp; &nbsp; totalAmount += amount;&nbsp; &nbsp; end++;&nbsp; }&nbsp; // Now flush the sublist between start and end:&nbsp; createFile(items.subList(start, end));&nbsp; // Now move on to the next.&nbsp; start = end;}(*) 您可能会得到一个超过总和的单元素子列表,例如,如果数量为 801。除了自己编写之外,您无法对这种情况做任何事情。

肥皂起泡泡

关于生成长度为 8、9、9、4 的子列表的修订代码,问题是在将当前子列表刷新到文件后,您totalAmount错误地重置了,没有考虑您当前正在处理的项目。您最终temp包含一个元素,但totalAmount为零。为了totalAmount反映amounttemp 中项目的正确总和,该替代方案应该更像这样:&nbsp; &nbsp; if (totalAmount > 800) {&nbsp; &nbsp; &nbsp; &nbsp; createFile(temp);&nbsp; &nbsp; &nbsp; &nbsp; temp.clear();&nbsp; &nbsp; &nbsp; &nbsp; temp.add(item);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // temp now contains one element&nbsp; &nbsp; &nbsp; &nbsp; totalAmount = item.getAmount();&nbsp; // this is the 'amount' of that element&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java