0

因此此方法执行每日检查,将一天添加到显示的天数以确定项目的新鲜度,因此该方法添加一天然后通过调用方法 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++;
    }

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

这就是 a 编写日常检查方法的方式

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

并且输出错误

4

3 回答 3

1

大多数代码源于您更改要枚举的数组中的元素位置这一事实。另一种更适合删除元素的数据结构(例如链表)将大大简化您的代码并且效率更高。

于 2019-12-05T20:58:44.517 回答
0

正如 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++;
    }
}
于 2019-12-05T21:40:59.977 回答
0

为什么不使用ArrayList.removeAll (Collection c)?这样,您可以创建一个Collection,例如 ArrayList ,遍历原始列表,将所有腐烂的项目添加到您的新集合中,然后在遍历整个列表后在原始 ArrayList 上调用 removeAll ?这样,您不必担心在迭代列表时修改列表。

于 2019-12-05T21:57:27.533 回答