Java 如何将数组中某个变量的每个实例设置为null,并将每个变量向左移动
我试图创建一个方法,将数组中变量elt的每个实例设置为null,然后将其后的每个变量向左移动。我编写的当前代码只将变量的第一个实例设置为null,并将所有其他变量向左移动,但没有将elt的任何其他实例设置为null。到目前为止,我的代码如下Java 如何将数组中某个变量的每个实例设置为null,并将每个变量向左移动,java,arrays,for-loop,Java,Arrays,For Loop,我试图创建一个方法,将数组中变量elt的每个实例设置为null,然后将其后的每个变量向左移动。我编写的当前代码只将变量的第一个实例设置为null,并将所有其他变量向左移动,但没有将elt的任何其他实例设置为null。到目前为止,我的代码如下 public T remove(T elt) { boolean exist = false; for (int i=0; i<data.length; i++) { if (data[i]
public T remove(T elt) {
boolean exist = false;
for (int i=0; i<data.length; i++) {
if (data[i] == elt) {
data[i] = null;
size--;
exist = true;
for (++i; i < data.length; i++) {
data[i-1] = data[i];
}
}
}
if (exist == true)
return elt;
else
return null;
}
public T remove(T elt){
布尔存在=假;
对于(inti=0;i,从代码的外观来看,您似乎希望使用“List”类型
这样,您就可以添加和删除变量,而不必编写一个完整的新函数来执行此操作。您的内部和外部循环都使用变量i
。当找到第一个匹配项时,记录将被删除,i
将增加到数据。长度(将剩余记录向左移动时)。当返回到外循环时,i=data.length
,外循环终止
您应该为内部循环使用不同的变量。解决“全部删除并移位”问题的常见方法是在一个循环中使用两个单独的索引执行所有操作,一个用于读取,另一个用于写入:
int rd = 0, wr = 0;
while (rd != data.length) {
if (data[rd] != elt) { // Shouldn't you use equals() instead?
data[wr++] = data[rd++];
} else {
rd++;
}
}
while (wr != data.length) {
data[wr++] = null;
}
这项技巧在实践中非常有用。我强烈建议你用纸和铅笔来完成一两个例子,以确保你完全理解它。为了练习:
public T remove(T elt) {
boolean exist = false;
for (int i=0; i<size; i++) { // changed data.length to size to avoid unnecessary iterations over deleted positions
while (data[i] == elt) { // changed if to while
data[i] = null;
size--;
exist = true;
for (int j = i+1; j < data.length; j++) { // changed iteration variable, we don't want to move i
data[j-1] = data[j];
}
}
}
if (exist == true)
return elt;
else
return null;
}
public T remove(T elt){
布尔存在=假;
对于(int i=0;iI)而言,我会投票赞成对问题的正确描述,但dasblinkenlight的答案修复了(未说明的)还有非线性响应时间问题。我对dasblinkenlight的解决方案投了更高的票,因为我发现它更好。非常感谢您的帮助。我非常感谢您的解决方案,因为它有助于澄清我原始代码中的错误。我也非常感谢@dasblinkenlight的解决方案,因为它教会了我一些新的东西。只是一个互动sting观察,代码没有像你上面写的那样工作。正如上面写的那样,它实际上删除了数组中的每一项。我将while循环改回了我最初在OP中使用的if语句,现在代码完全按照我最初想要的方式工作。你编写的第二个for循环对我帮助很大!@Omar interest.Also、 我认为代码没有正确地删除复制到左边的元素(除非最后一个元素实际上是匹配的),在内部循环之后可能会有data[data.length-1]=null
。您应该检查当有两个“hello”时它会做什么如果最后一个元素与elt
不匹配,那该怎么办呢?谢谢!这篇文章内容丰富,教了我很多东西。我非常感谢这篇文章解决了非线性响应时间问题。
public T remove(T elt) {
boolean exist = false;
for (int i=0; i<size; i++) { // changed data.length to size to avoid unnecessary iterations over deleted positions
while (data[i] == elt) { // changed if to while
data[i] = null;
size--;
exist = true;
for (int j = i+1; j < data.length; j++) { // changed iteration variable, we don't want to move i
data[j-1] = data[j];
}
}
}
if (exist == true)
return elt;
else
return null;
}