实现相同的结果但使用不同类型的循环

achieving the same result but using a different kind of loop

因此此方法执行每日检查,将一天添加到 displayedDays 以确定项目的新鲜度,因此该方法添加一天然后通过调用方法 isRotten() 检查它是否已腐烂以及是否已腐烂它删除了数组

    for (int i = 0; i < numItems; i++) {
        items[i].displayedDays++;
    }

    for (int i = 0; i < numItems;) {

        if (items[i].isRotten()) {
            if (removeItem(i)) {
                if (i > 0) {
                    i--;
                }
                continue;
            }
        }

        i++;
    }

这也是使用相同循环和 if 的另一种方法 所以这个方法应该从数组中删除糖果(数组有两种类型的项目面包和糖果)

    double totalSweetsPrice = 0;

    int count = numItems;

    for (int i = 0; i < count;) {
        Item item = items[i];

        if (item instanceof Sweet) {
            totalSweetsPrice += item.getPrice();
            if (removeItem(i)) {
                if (i > 0) {
                    i--;
                }
                continue;
            }
        }
        i++;
    }

我不明白中间部分,希望有一个不同的循环或其他东西,同时得到相同的结果

每日检查方法就是这样写的

    for (int i = 0; i < numItems; i++) {
    items[i].displayDays++ ;
    if(items[i].isRotten())
    removeItem(i); }

输出错误

大部分代码源于您更改正在枚举的数组中的元素位置这一事实。一种更适合删除元素的不同类型的数据结构,例如链表,将大大简化您的代码并提高效率。

正如 FooBar 所说,您不能既迭代 ArrayList 又从同一个 ArrayList 中删除项目。所以你需要把条件分开。例如:

for (int i = 0; i < items.size(); i++) {
    items.get(i).displayedDays++;
}

int i = 0:
while (i < items.size()) {
    if(items.get(i).isRotten()) {
        items.remove(i);
        // don’t increment our counter here because now 
        // we’ve changed what object exists in the ArrayList 
        // at this index position
    } else {
        // only increment our counter if the item in that index
        // is good, so we can now move on to check the next item
        i++;
    }
}

为什么不使用ArrayList.removeAll(Collection c)? This way, you can create a Collection,例如ArrayList,遍历原始列表,将所有烂项目添加到新集合中,然后在遍历整个列表后对原始ArrayList 调用removeAll?这样,您就不必担心在遍历列表时修改列表。