Java 理解添加到数组方法的逻辑

Java 理解添加到数组方法的逻辑,java,Java,此方法用于插入要添加的元素作为数组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的新第一个元素,将所有当前元素移位以留出空间。数组的原始最后一个元素将丢失。该方法没有返回值,如果数组没有元素,则该方法应该没有效果

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?为什么i>0?我呢


谢谢

您正在从数组的最后一个元素浏览到第一个元素,同时将每个元素移动一个。例如,当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;
    }
}
--i
在使用前减小
i
的值,使其应为
i--
i
应从
arr.length
开始,否则您将不会移动最后一个元素

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

它是
i=arr.length-1
,这是数组的最后一个索引。您必须开始向后移动循环的元素(
--i
i--
也可以),否则您将在移动元素之前覆盖它们

为什么i>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;
    }
}

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

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


最后,将
toAdd
添加到0的行应该在for循环之外。

尝试使用一张纸上的简单数组执行该算法。它将帮助您理解它。如果您考虑执行从
i=0
arr.length-1
的算法,请在纸上尝试:您将需要一个额外的变量,否则会丢失一些信息。反向执行循环可以去除此变量。@ArnaudDenoyelle谢谢,反向执行循环意味着什么?@jun我的意思是,从
I=arr.length-1
迭代到
I=0
(使用
I--
),而不是从
I=0
迭代到
I=arr.length-1
(使用
i++
)@ArnaudDenoyelle我想我现在开始明白了。谢谢!谢谢。如果我明白了,arr.length将通过计算每个占用索引来生成数组中的元素总数。如果我们有0,3,2。那么1+1+1=3。既然我们知道了数组的总长度,我们就可以使用这些信息来找到最后一个索引号是。因为arr.length将其计数为人类将1,2,3,4。然而,计算机将其计数为0,1,2,3,4。那么arr.length始终是一个接一个的,因此我们必须从arr.length中删除一个,以获得计算机已计数的正确的最后位置。因此,arr.length确实给出了正确的元素数,但arr.length是also有用的是,我们可以使用它来计算计算机计数0,1,2,3,4和arr.length计数1,2,3,4,其中1,2,3,4总是计算正确的元素数。如果知道arr.length总是在计算机计算之前,那么将它用作获取最后一个索引的工具是非常好的因此,我们使用通过arr.length确定的信息来获得正确的最后一个索引的位置号。或者再次说,arr.length将始终比计算机计算索引的方式早一个。并且知道我们可以减去一来得到计算机计算索引的方式,-1就像调整它以生成用与计算机相同的方法更正上一个索引。谢谢!如果有6个元素,它是否会进入for循环:6-1=5;5>0;5-1=4-1=3;3>0;3-1=2-1=1;1>0;1-1=0-1=-1;-1>0循环结束?arr[i]=arr[i-1];这很像是说将原始数组分配给所有人,但返回一步(即-1步)。因此,每个人的索引都会被交易/交换为执行该操作的索引,直到数组索引为0,这时我们直接将其细分。