【问题标题】:Remove an element from array and replace with 0?从数组中删除一个元素并替换为 0?
【发布时间】:2021-09-05 21:50:30
【问题描述】:

public static void remove (int[] arr, int toRemove)
“它应该从数组中删除 toRemove 的值。剩余的元素应该只是移向数组的开头。(数组的大小不会改变)。由于数组现在使用的元素减少了,原来的最后一个元素应该只替换为 0。如果数组中出现多个 toRemove,则只删除第一个出现。如果数组没有元素,它应该没有任何效果。

到目前为止,我有这个:

public static void remove(int[] arr, int toRemove) {
    for(int i = 0; i <= arr.length - 1; i++) {
        if(arr[i] == toRemove) {
            arr[i] = arr[i + 1];
            arr[toRemove] = 0;
        }
    }
}

我有一个包含其内容的数组的 main 方法:[3, 5, 7, 8, 12, 2] 和一个调用 remove(array, 5)。但是,我的数组打印出[3, 7, 7, 8, 12, 0],而它应该打印出[3, 7, 8, 12, 2, 0]

谁能告诉我我的错误并解释一下?

【问题讨论】:

  • 所以您的代码发现 arr[1] 为 5,将其设置为 arr[2],即 7,然后由于某种原因您将 arr[5] 设置为零。您不会移动任何其他元素。
  • 两件事-您将toRemove元素的索引替换为0,而不是实际的最后一个元素,因此在您的情况下,您将删除arr[5](在这种情况恰好是最后一个元素),并且您没有考虑多次出现toRemove
  • 使用调试器单步调试代码
  • @ManishGiri 我只应该删除第一次出现然后程序结束。而且由于它是一个循环,这是否意味着它将所有当前索引设置为向左移动的下一个索引(i + 1)?我相信我仍然不了解如何转移所有其他元素。
  • 如果数组中有很多倍的值toRemove怎么办?

标签: java arrays for-loop


【解决方案1】:

这是一种方法,类似于我在上面的 cmets 中描述的方法。

import java.util.Arrays;
public class main
{
    // tip: arguments are passed via the field below this editor
    public static void main(String[] args)
    {
        int[] arr = {3, 5, 7, 8, 5, 12, 2};
        remove(arr, 5);
        System.out.println(Arrays.toString(arr)); // [3, 7, 8, 5, 12, 2, 0]
    }

    public static void remove(int[] arr, int toRemove) {
        int idx = -1;
        // determine first occurrence of toRemove
        for(int i = 0; i < arr.length; i++) {
            if(arr[i] == toRemove) {
                idx = i;
                break;
            }
        }
        // if not found, return
        if(idx == -1) return;
        // shift other elements down
        for(int i = idx; i < arr.length-1; i++) {
            arr[i] = arr[i+1];
        }
        // set last element to 0
        arr[arr.length-1] = 0;
    }
}

【讨论】:

  • 我们可以交流吗?我知道我无权问,但我确实想擅长编码,但有些事情我很难理解。我需要以基本的方式解释概念。我有一个编码项目,如果您愿意帮助其他学习者,我需要帮助。我的电子邮件是 nguyen_david1949@yahoo.com。感谢您的阅读!
  • @Manash Giri 先生,我刚刚给您发了电子邮件。
【解决方案2】:

你需要有两个索引:

fromIndex 是数组中的那个。

toIndex 是项目需要的位置。

public static void remove(int[] arr, int toRemove) {
    int toIndex = 0;
    for(int fromIndex = 0; fromIndex < arr.length; fromIndex++) {
        //paste number only if its not 'toRemove'
        if(arr[fromIndex] != toRemove) {
            arr[toIndex] = arr[fromIndex];
            toIndex++;
        }
    }

    //Fill the rest with 0
    for (; toIndex < arr.length; toIndex++)
        arr[toIndex] = 0;
}

如果有多个索引的值为 toRemove,则此方法有效

【讨论】:

    【解决方案3】:

    您应该使用System.arraycopy。它很快。 试试这个。

    public static void remove(int[] arr, int toRemove) {
        for(int i = 0, length = arr.length; i < length; i++) {
            if(arr[i] == toRemove) {
                System.arraycopy(arr, i + 1, arr, i, length - i - 1);
                arr[length - 1] = 0;
                break;
            }
        }
    }
    
    public static void main(String[] args) throws IOException {
        int[] a0 = {0, 1, 2, 3, 4};
        remove(a0, 0);
        System.out.println(Arrays.toString(a0));
        int[] a4 = {0, 1, 2, 3, 4};
        remove(a4, 4);
        System.out.println(Arrays.toString(a4));
        int[] a5 = {0, 1, 2, 3, 4};
        remove(a5, 5);
        System.out.println(Arrays.toString(a5));
        int[] a6 = {0};
        remove(a6, 0);
        System.out.println(Arrays.toString(a6));
        int[] a7 = {};
        remove(a7, 0);
        System.out.println(Arrays.toString(a7));
    }
    

    输出:

    [1, 2, 3, 4, 0]
    [0, 1, 2, 3, 0]
    [0, 1, 2, 3, 4]
    [0]
    []
    

    【讨论】:

      猜你喜欢
      • 2012-08-26
      • 2016-10-31
      • 2013-05-27
      • 2018-11-16
      • 2013-10-04
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多