在 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
,您将用 7
s、接下来的 8
s 和最后的 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;
第一行代码查找数组中 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 = 9
和 idx = 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++;
}
我必须在 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
,您将用 7
s、接下来的 8
s 和最后的 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;
第一行代码查找数组中 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 = 9
和 idx = 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++;
}