在java数组中建立索引

时间:2015-01-10 12:05:35

标签: java arrays

我必须在Java中编写一个方法,其中输入数组a和数字x返回一个元素数组,这些元素跟随最后一次出现的x in a

例如,对于输入{0,1,2,3,4,5,6,7,8,9}x=6,该方法必须返回{7,8,9},同时{4,1,4,2}x=4该方法必须返回{2}并且如果x不在a中,那么它必须返回空数组{}(或长度为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循环ideea的阅读也不那么复杂)

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;
}

4 个答案:

答案 0 :(得分:1)

您希望复制所有剩余的值,并创建索引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,您将填充包含7 s,下一个8和最后9 s。

的数组

但是,您可以使用组合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;

答案 1 :(得分:1)

第一行代码查找数组内部的最后一个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);

答案 2 :(得分:1)

我们假设您采用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 = 5s[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];

你在这做什么?

您构建了一个长度为t[]的新数组s.length - idx - 1,在我们的案例s.length = 9idx = 5中,我们将s.length - idx - 1设为3我们可以检查x = 6之后的元素数量。

现在,我们从i(上面解释的原因)到idx + 1

启动迭代器s.length

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

希望它有说服力。如果您仍有任何疑问,请发表评论。

答案 3 :(得分:0)

试试这个:

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