在 java 数组中建立索引

Indexing in java arrays

我必须在 Java 中编写一个方法,其中输入一个数字数组 a 和一个数字 x returns 元素数组在 a 中最后一次出现 x 之后。

例如输入 {0,1,2,3,4,5,6,7,8,9}x=6 方法必须 return {7,8,9} 同时输入 {4,1,4,2}x=4 方法必须 return {2} 如果 x 不在 a 中,那么它必须 return 空数组 {} (或长度为 0 的数组)

所以我得到了这个答案:

int idx = -1;
for (int i = 0; i < s.length; i++) { 
    if (s[i] == x)
        idx = i;
}

/* After you found this index, create a new array starting 
 * from this element. It can be done with a second (not nested) for loop, or you can
 * use Arrays.copyOfRange()
 */

//make sure idx != -1
int[] t = new int[s.length - idx - 1];
for (int i = idx + 1; i < s.length; i++)
    t[i - idx - 1] = s[i];

这非常有帮助,但我不明白为什么会这样:(已编辑;好的,现在我明白为什么会这样了,但即使在我看来,组合的 for 循环思想更容易阅读)

t[i - idx - 1] = s[i];

而这不是:

int[] t = new int[a.length - indx - 1];
for (int j = indx + 1; j < a.length; j++) {
    for (int i = 0; i < t.length; i++) {
        t[i]=a[j];
    }
}
return t;

已编辑: 澄清这是所有代码

int[] dopoX(int[] a, int x) {
    int n = a.length;
    int[] c = new int[0];
    int indx = 0;
    int nrx = 0;
    for (int j = 0; j < a.length; j++) {
        if (a[j] == x)
            nrx++;
        if (a[j] == x)
            indx=j;
    }
    if (nrx == 0)
        return c;   
    int[] t = new int[n - indx - 1];
    for (int j = indx + 1; j < n; j++) {
        for (int i = 0; i < t.length; i++) {
            t[i] = a[j]; /* it returns just 1 number of a[] like t{2,2,2,2,2,2,2,2} which is 
                            not correct */          
        }
    }
    return t;
}

那么你想复制所有剩余的值,并创建一个索引数组 t。因此,您需要从 i=0 开始。然而,你可以执行一个shift-operation:在某处增加i,当你使用它时,将它移回去,所以:

for (int i = idx+1; i < s.length; i++)
    t[i-idx-1] = s[i];

等同于:

for (int i = 0; i < t.length; i++)
    t[i] = s[i+idx+1];

(这样也更具可读性)


关于你的第二个问题:

这里你使用 nested loop:第二个 for 循环将重复第一个循环的每次迭代。

结果是,在第二个 for 循环中,j 始终固定,在第一次迭代中输入 {1,2,...,9}6,您将用 7s、接下来的 8s 和最后的 9s.

填充你的数组

但是您可以使用 组合 for 循环:

int []t=new int[n-indx-1];
//       /-- grouped initializers      /-- grouped increments
//       |                             |
for(int i=0, j= indx+1; i < t.length; i++, j++){
    t[i]=a[j];
}
return t;

第一行代码查找数组中 x 的最后一个索引。

第二行使用Arrays的内置函数,从数组中复制一个范围到一个新的副本中。

然后我们从最后一个 x 之后的值复制到数组 a 的长度。

第一行可以重写为从数组的末尾向后搜索,中间有一个断点。这会提高性能,但会降低代码的可读性。

for(int i=0; i<a.length;i++) if(a[i]==x) idx=i;

int[] b = Arrays.copyRangeTo(a, idx+1, a.length);

假设您采用 a[] = {1,2,3,4,5,6,7,8,9}x = 6 的情况。 运行 这个:

int idx = -1;
for (int i = 0; i < s.length; i++) { 
if (s[i] == x) idx = i;
}

你得到 idx = 5 作为 s[5] == x

现在我们要将 x 最后一个实例之后的数组复制到新数组 t[].

显然,您必须从索引 idx + 1 开始,因为 idx 包含最后一次出现的 x

因此,此代码:

int[] t = new int[s.length - idx - 1];
for (int i = idx+1; i < s.length; i++)
    t[i-idx-1] = s[i];

你在这里做什么?

你构造了一个长度为 s.length - idx - 1 的新数组 t[],在我们的例子中 s.length = 9idx = 5 因此,我们有 s.length - idx - 1 作为 3 我们可以检查这是 x = 6.

之后的元素数

现在,我们启动迭代器i,从idx + 1(上面解释的原因)到s.length

我们有 t[i - idx - 1] 因为当 i = idx + 1, i - idx - 1 = 0。因此,随着 i 的增加,您的 i - idx - 1 也会增加。

希望这是令人信服的。如果还有疑问请评论。

试试这个:

int j=0;
int i=idx+1;
while (j<t.length) {
    t[j] = s[i];
    j++;
    i++;
}