此方法的职责是从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整数。在这之后我迷路了。
为什么另一个循环? 为什么我们采用先前的循环变量并为其添加1? 为什么在第二个循环中我们使用参数“list”并使用set方法? 为什么j - 1? 为什么list.get(j)? 为什么在第二个循环结束后有一行: list.set(list.sise() - 1,0)? 为什么我 - ?
有许多活动部件,我想了解逻辑。
谢谢
答案 0 :(得分:0)
首先,if语句是赋值操作,这是不正确的。您需要将=更改为==。我已经解释了代码中的每一步 -
public static void removeAll(ArrayList<Integer> list, int toRemove) {
//start with the first number in the list until the end searching for toRemove's
for (int i = 0; i < list.size(); i++) {
//if the value at i is the one we want to remove then we want to shift
if (list.get(i) == toRemove) {
//start at the index to the right until the end
//for every element we want to shift it the element to its left (i == j - 1)
for (int j = i + 1; j < list.size(); j++) {
//change every value to whatever was to the right of it
//this will overwrite all values starting at the index where we found toRemove
list.set(j - 1, list.get(j));
}
//now that everything is shifted to the left, set the last element to a 0
list.set(list.size() - 1, 0);
//decrement to adjust for the newly shifted elements
// this accounts for the case where we have two toRemoves in a row
i--;
}
}
}
在此函数结束时,通过在每次找到值时将arraylist移动到左边并且将最后一个元素设置为0来“删除”与toRemove匹配的任何值。
实施例
removeAll([1,2,3,4,5,5,6,7,8,5,9,5], 5)
输出
[1,2,3,4,6,7,8,5,9,0,0,0]
答案 1 :(得分:0)
请参阅以下内容以了解详细信息(从分钟5:50或5:57开始)
https://www.youtube.com/watch?v=qTdRJLmnhQM
你需要第二个for循环,在你删除它的元素之后取出所有元素并将它移到一个左边,所以基本上它填满了空的空间去除它所以这就是这个做。