嵌套for循环中的手动数组复制

时间:2018-01-22 09:54:16

标签: java arrays

我试图找到所有2,将它们移动到数组的后面,然后将它们转换为0而不会丢失数组的顺序。例如,[1,2,3,2,2,4,5]将变为[1,3,4,5,0,0,0]。我的代码工作正常,但IDE告诉我嵌套的for循环是手动复制数组,并希望我用System.arraycopy()替换它。我该怎么做呢?

代码如下所示:

    int[] numbers = {1,2,3,2,2,4,5};
    for (int i = 0; i < numbers.length; i++){
        if (numbers[i] == 2){
            for (int j = i; j < numbers.length - 1; j++){
                numbers[j] = numbers[j + 1];
            }
            numbers[numbers.length-1] = 0;
            i --;
        }
    }

4 个答案:

答案 0 :(得分:2)

内圈可以用arraycopy替换,但是,你不需要内循环:

int[] numbers = {1,2,3,2,2,4,5};
int j = 0;
for (int i = 0; i < numbers.length; i++){
    if (numbers[i] != 2){
        numbers[j++] = numbers[i];
    }
}
while (j < numbers.length) {
   numbers[j++] = 0;
}

更新

甚至:

int[] numbers = {1,2,3,2,2,4,5};
int j = 0;
for (int n: numbers){
    if (n != 2){
        numbers[j++] = n;
    }
}
Arrays.fill(numbers,j,numbers.length,0);

答案 1 :(得分:1)

关键是非常简单:如果你能减少你负责的代码行(例如通过使用Arrays.arraycopy()等实用程序方法) - 那么就这样做。 / p>

请记住:您今天写的每一行,明天都必须阅读和理解,并且可能会在5周或几个月内修改。

然而:我认为你在这里过于复杂的事情。我会使用临时列表,如下所示:

List<Integer> notTwos = new ArrayList<>();
int numberOfTwos = 0;
for (int i=0; i<source.length; i++) {
  if (source[i] == 2) {
    numberOfTwos++;
  } else {
    notTwo.append(source[i]);
  }
}
... simply append `numberOfTwo` 0s to the list, and then turn it into an array

您会看到:您正在嵌套两个 for循环,并且您反复复制元素。这是低效的,难以理解,无论你怎么做:太复杂了。如图所示:使用第二个列表/数组,可以解决&#34;解决问题。 传递中的此问题。

答案 2 :(得分:1)

以下声明:

  def default_url_options(options = {})

    { locale: I18n.locale == I18n.default_locale ? nil : I18n.locale }.merge(options)

  end

可以替换为:

for (int j = i; j < numbers.length - 1; j++){
    numbers[j] = numbers[j + 1];
}

IntelliJ等IDE会在您按System.arraycopy(numbers, i + 1, numbers, i, numbers.length - 1 - i); + alt(默认组合键)时自动建议。

现在约arraycopy()

从文档中,java.lang.System.arraycopy()将n个元素(最后一个参数)从源数组(第一个参数)复制到目标数组(第三个参数),相应的索引从(第二个和第四个参数)开始。

更具体地说,当调用enter时,参数是:

  1. arraycopy(numbers, i + 1, numbers, i, numbers.length - 1 - i):源数组。
  2. numbers:源数组中的起始位置。
  3. i + 1:目标数组。
  4. numbers:目标数据中的起始位置。
  5. i:要复制的数组元素数。
  6. 在你的情况下,元素将从你的数组复制到自身,但是源起始位置从目标起始位置移开的事实将导致你所追求的全局移动(将元素移动到左边) )。

    关于要移动的元素数量,它应该移动numbers.length - 1 - i个元素减去第一个不移动的元素,只会被覆盖。因此i

答案 3 :(得分:0)

用System.arrayCopy替换内部循环后,代码应如下所示:

    int[] numbers = { 1, 2, 3, 2, 2, 4, 5 };
    for (int i = 0; i < numbers.length; i++) {
        if (numbers[i] == 2) {
            System.arraycopy(numbers, i + 1, numbers, i, numbers.length - 1 - i);
            numbers[numbers.length - 1] = 0;
            i--;
        }
    }