【问题标题】:For loop that shifts array's last value to the left to replace a value x in JavaFor循环将数组的最后一个值向左移动以替换Java中的值x
【发布时间】:2015-02-20 12:43:29
【问题描述】:

我有以下接受通用对象的方法(当我使用它时,我传递一个Integer 对象)并删除数组中该位置的对象。请注意,我的

private currentSize;
private E[] list;
...
public E remove(E obj){

    for (int i = 1; i < currentSize; i++)
        if( ((Comparable<E>)obj).compareTo(list[i]) == 0){

            for(int j = i; j < currentSize; j++)
                list[j] = list[j+1];
            currentSize--;
            return obj;
        }

    return null;
}

我还有另外两种方法与我上面的方法相关。

for(int i=1; i <= 10; i++)
    list.addLast(i);

上面的代码将 10 个连续的ints 添加到我的数组中。 (这很好用。注意addLast 方法只解析一个原始的int,因为我在addLast() 中声明了它)

for(int i=1; i <= 10; i++){
   list.remove(new Integer(i));  
}

上面的代码删除了我们之前添加的那 10 个ints。我的 remove() 方法很有效,它会从数组中删除除 1 之外的所有 Integer 对象。

当我在另一个类中同时调用 addLastremove 方法时的输出:

"1 2 3 4 5 6 7 8 9 10

现在全部删除

列表的当前大小:(应该为零)1"

前面的那个(应该为零)不应该在那里。请注意,我试图忽略数组的 0 索引。另外,我想知道实现我最里面的 for 循环 for(int j = i; j &lt; currentSize; j++) 的向后实现的方式。有点像[1,2,3,4,5] ... 如果我想“删除”数组中的#2,我会从数组的末尾而不是开头开始。

addLast 方法代码:

public void addLast(E obj){
        list[currentSize++] = obj;
        //System.out.println(currentSize);
        }

打印数组中的所有对象:

for(int x : list)
    System.out.print(x + " ");
System.out.println("\n");

【问题讨论】:

  • 显示您正在调用的所有代码。例如,remove 只查看索引 1 到 currentSize-1,如果 currentsize 是元素的数量,这很糟糕,但如果 currentSize 是元素的数量加一,则可以。请阅读this。你的写作也不清楚,特别是当你提到事物的一部分时。
  • Re“我会从数组的末尾开始”:你的意思是你想要一个运算符 remove_nth_last(n)?
  • Re "list[currentSize++] = obj": 这应该是 if (currentSize+1

标签: java arrays generics for-loop


【解决方案1】:

java 中的数组是零基数。所以你必须在你的循环中从零开始:

for(int i=0; i < 10; i++){
   list.remove(new Integer(i));  
}

还有:

private currentSize;
private E[] list;
...
public E remove(E obj){

    for (int i = 0; i < currentSize; i++)
        if( ((Comparable<E>)obj).compareTo(list[i]) == 0){

            for(int j = i; j < currentSize; j++)
                list[j] = list[j+1];
            currentSize--;
            return obj;
        }

    return null;
}

【讨论】:

  • 我想忽略数组的第 0 个索引,就好像它不存在一样。如果你能看到,在我的 addMethod 中,我也是从 i = 1 开始的。列表中元素的实际数量由 currentSize 变量保存
【解决方案2】:

remove 方法中的循环忽略了数组的第一个元素(在您的情况下为 1),因此它永远不会被删除:

for (int i = 1; i < currentSize; i++)

改成

for (int i = 0; i < currentSize; i++)

让我们看看你的 addLast 方法:

list[currentSize++] = obj;

当列表为空时(即 currentSize 为 0),currentSize++ 返回 0(因为它是后缀增量)并将第一个元素添加到 list[0]。因此,从数组中删除元素时,您必须考虑从 0 到 currentSize-1 的所有索引。

【讨论】:

  • 问题是我想忽略数组的索引 0...所以实际的起始索引是 1。
  • @JackGal 你的addLast 方法是否忽略了数组的第一个索引?您没有显示该方法的代码。
  • 如果你能看到,在我的 addMethod 中我也从 i = 1 开始。列表中元素的实际数量由 currentSize 变量保存。请参阅我的编辑以查看 addLast 方法。谢谢!
  • @JackGal 用addLast 添加的第一个数字是1 并不意味着1 被添加到数组的1 索引中。实际上,list[currentSize++] = ob 意味着第一个元素将被添加到数组的0 索引中。
  • 我刚刚注意到...我将其更改为list[++currentSize] = obj,但它会引发错误:ERROR java.lang.NullPointerException。你知道为什么吗?
【解决方案3】:

前面的那个(应该为零)不应该在那里。

看起来你的循环应该是i &lt;= currentSize。即您可能没有检查要删除的项目是否是最后一个。因此,当您要求删除 1 时,找不到它。

但是你没有提供足够的信息。

How to create a Minimal, Complete, and Verifiable example.

我想知道实现倒退的方式 实现我最里面的 for 循环 for(int j = i; j &lt; currentSize; j++)

为什么?这甚至意味着什么?如果您想保持元素有序,那么您当前的代码已经将每个元素直接放入正确的位置。如果您不关心顺序,那么您可以将最后一个元素移动到要删除的元素的位置 list[i] = list[currentSize--] 而不是在 j 上循环。

但同样,您没有向我们提供足够的信息,说明您的操作员的外部行为应该是什么,或者外部状态如何由内部状态表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-07
    • 1970-01-01
    • 2016-07-14
    • 2020-01-20
    • 2021-04-08
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多