了解添加到数组方法的逻辑

时间:2017-01-25 16:37:45

标签: java

此方法用于将元素toAdd作为数组arr的新第一个元素插入,将所有当前元素移位以创建空间。数组的原始最后一个元素将丢失。该方法没有返回值,如果数组没有元素,它应该没有效果。

public static void insert(int[] arr, int toAdd){

    if(arr.length > 0) {

        for(int i = arr.length - 1; i > 0; --i) {
            arr[i] = arr[i - 1];
        }
        arr[0] = toAdd;
    }
}

我理解if(arr.length> 0)这一部分可以保证我们正在使用至少包含1个元素的数组。其余的逻辑让我感到困惑。为什么设置i = arr.length,为什么a - 1之后呢?为什么我> 0?和--i?

谢谢

3 个答案:

答案 0 :(得分:2)

您正在将数组从最后一个元素浏览到第一个元素,同时将每个元素移动一个元素。例如,当i = 3时,我们将元素2移动到位置3。

但这种方法不起作用。正确的版本是:

public static void insert(int[] arr, int toAdd){
    if(arr.length > 0) {
        for(int i = arr.length - 1; i > 0; i--) {
            arr[i] = arr[i - 1];
        }
        arr[0] = toAdd;
    }
}

--ii使用之前降低i--的值,因此iarr.length应该从import { Injectable } from '@angular/core'; @Injectable() export class DateService { constructor() { } public static parseDate(dateString: string): Date { if (dateString) { return new Date(dateString); } else { return null; } } } 开始,否则您将无法移动最后一个元素。

答案 1 :(得分:0)

  

为什么设置i = arr.length和--i?

它是i = arr.length-1,这是数组的最后一个索引。你必须开始向后循环移动元素(--ii--也没问题),否则你可以在移动它们之前重写元素。

  

为什么我> 0?

arr[0] = toAdd;应该在循环之外,并且arr.length == 0会失败。

您可以简化为:

public static void insert(int[] arr, int toAdd){
    if(arr.length > 0) {
        for(int i = arr.length - 1; i > 0; --i)
            arr[i] = arr[i - 1];
        arr[0] = toAdd;
    }
}

答案 2 :(得分:0)

arr.length将返回数组中的元素数。如果你有一个包含索引0,1和2的元素的数组,它将返回“3”。问题是数组索引包含0,所以你需要从长度中减去1来获得数组中最后一个元素的有效索引。 (即3 - 1 = 2和2是最后一个元素的真实索引)

循环使用i > 0,因为索引i正在被' - i'递减(即i = i -1)。因此循环从数组中的最高元素(长度-1)开始,并向下计数到最低(索引0)。

最后,将toAdd分配给0的行应该在for循环之外。