ListIterator跳过元素,但我想检查它们

时间:2018-04-01 12:01:27

标签: java

好的,我有两个ArrayLists。第一个arraylist从结束开始,并尝试从我的第二个添加项目,从头开始。我必须listIterators,其概念是将项目添加到第一个列表中,直到达到最大容量,然后我继续将新项目添加到第一个列表的第二个项目,依此类推。问题是当我尝试从第二个列表中删除项目时,列表将不会重新排序,并且不会检查某些项目。这是代码:

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);

                    }
                }
            }
        }

    }
}

1 个答案:

答案 0 :(得分:0)

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

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

如果这是假的,那就是当前货车上没有足够的空间用于当前的货物,那么这不仅意味着货物不会被添加到货车中,而且这个特定的货物也不会是自从循环结束后将到达所有货车,并使用hasNext()取代下一批货物。

在这一点上,我认为很容易发生更多的货物,因为它很可能是非常满的。一旦到达stIterator的末尾,你就会得到一个新的旅行车来填充使用previous(),但是现在stIterator.hasNext()将始终返回false,因为你在迭代器的末尾所以没有更多的货车将被任何货物填充。

有几种方法可以解决这个问题,但我认为你应该做的一件事就是分担责任,让Wagon班负责添加货物,这样我就可以更简单地编写工作循环。

我建议在Wagon类

中添加一个add方法
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;
}