【发布时间】:2017-01-30 22:58:43
【问题描述】:
此方法的职责是从 arrayList 中删除所有出现的值 toRemove。剩余的元素应该只是移向列表的开头。 (大小不会改变。)末尾的所有“额外”元素(无论列表中出现了多少次 toRemove)都应该用 0 填充。该方法没有返回值,如果列表没有元素,它应该没有效果。 不能使用 ArrayList 类中的 remove() 和 removeAll()。
方法签名是:
public static void removeAll(ArrayList<Integer> list, int toRemove);
解决办法:
public static void removeAll(ArrayList<Integer> list, int toRemove) {
for (int i = 0; i < list.size(); i++) {
if (list.get(i) = toRemove) {
for (int j = i + 1; j < list.size(); j++) {
list.set(j - 1, list.get(j));
}
list.set(list.size() - 1, 0);
i--;
}
}
我理解第一个 for 循环和 if 语句。因为人们想逐一遍历整个arrayList,并且对于arrayList中存在数字的每个索引,检查它是否是,实际上是toRemovee整数。在这一点之后,我迷路了。
为什么还有一个 for 循环? 为什么我们要取前面的循环变量并给它加 1? 为什么在第二个循环中我们使用参数“list”并使用 set 方法? 为什么 j - 1? 为什么 list.get(j)? 为什么在第二个循环结束后有这条线: list.set(list.sise () - 1, 0) ? 为什么我--?
有很多活动部件,我想了解其中的逻辑。
谢谢
【问题讨论】:
-
这不会编译。
-
“为什么要另一个 for 循环?” 满足 “剩余元素应该只是移向列表开头”的要求。也许你应该附加一个断点并遍历代码,看看它是如何变化的
-
@MadProgrammer 谢谢。我不明白它是如何转移到列表开头的。
-
@Jun 那你需要看看
ArrayList#set的JavaDocs 看看它做了什么