好的,我有两个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);
}
}
}
}
}
}
答案 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;
}