Java 如何将数组中某个变量的每个实例设置为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]

我试图创建一个方法,将数组中变量elt的每个实例设置为null,然后将其后的每个变量向左移动。我编写的当前代码只将变量的第一个实例设置为null,并将所有其他变量向左移动,但没有将elt的任何其他实例设置为null。到目前为止,我的代码如下

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;
}