【问题标题】:ListIterator skips elements but i want to check themListIterator 跳过元素,但我想检查它们
【发布时间】:2018-09-10 21:01:35
【问题描述】:

好的,所以我有两个 ArrayList。第一个数组列表从末尾开始,并尝试从我的第二个开始添加项目,第二个从头开始。我必须列出迭代器,其概念是将项目添加到第一个列表中,直到达到最大容量,然后我继续将新项目添加到第一个列表的第二个项目中,依此类推。问题是当我尝试从第二个列表中删除一个项目时,该列表不会重新排序,并且某些项目不会被检查。代码如下:

public void loadFromBeh(ArrayList<Cargo> storage) {
ListIterator<Wagon> waIterator = wagons.listIterator(wagons.size());
ListIterator<Cargo> stIterator = storage.listIterator();
    while (waIterator.hasPrevious()) {
        Wagon w = waIterator.previous();
        while (stIterator.hasNext()) {

            Cargo c = stIterator.next();

            System.out.println("pr " + w.current_weight);
            if (c.weight <= w.max_weight) {
                if (w.current_weight == 0) {
                    w.current_weight = c.weight;
                    System.out.println("first " + w.current_weight);
                    stIterator.remove();

                } else {
                    w.current_weight = w.current_weight + c.weight;
                    System.out.println("new current " + w.current_weight);
                    if (w.current_weight <= w.max_weight) {
                        w.cargos.add(c);
                        stIterator.remove();

                        System.out.println("ok " + w.current_weight);

                    }
                }
            }
        }

    }
}

【问题讨论】:

标签: java


【解决方案1】:

您的代码的问题不在于 remove(),而在于最后一个 if 子句

if (w.current_weight <= w.max_weight) {

如果这是错误的,即当前货车中没有足够的空间容纳当前货物,那么这不仅意味着货物不会被添加到货车中,而且该特定货物也不会成为其中的一部分ny wagon 因为将到达循环的结尾,并且将使用 hasNext() 获取下一个货物。

在这一点上,我认为很容易发生更多货物装不下当前货车的情况,因为它很可能已经满了。一旦到达 stIterator 的末尾,您将使用 previous() 获得一个新的货车来填充,但现在 stIterator.hasNext() 将始终返回 false,因为您在该迭代器的末尾,因此不会再有货车装满任何货物。

有几种方法可以解决这个问题,但我认为你应该做的一件事是分离职责并让 Wagon 类负责添加货物,我认为这将使编写工作循环更简单。

我建议在 Wagon 类中添加一个方法

public boolean add(Cargo cargo) {
  if ((cargo.weight > max_weight) || (current_weight + cargo.weight > max_weight)) {
    return false; 
  }

  current_weight += cargo.weight
  cargos.add(cargo);

  return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    相关资源
    最近更新 更多