For 循环有效,但 For Each 无效。为什么?
For loop works, but For Each does not. Why?
在包含 forEach 循环的行上抛出越界异常,但据我所知,这段代码没有任何问题。 for 循环从 char 数组的元素 0 开始循环直到到达最后一个元素......但是当我使用更长的 for 循环尝试此代码时,即
for(int i = 0; i < nested.length; i++)
代码按预期工作。
为什么在这种情况下for循环有效而forEach循环无效?
public static void main(String[] args) {
String S = "hello";
String curly1 = "{";
String box1 = "[";
String p1 = "(";
String curly2 = "}";
String box2 = "]";
String p2 = ")";
char[] nested = S.toCharArray();
int flag = 0;
if(nested[0] != curly1.charAt(0)) flag = 0;
if(nested[nested.length-1] != curly2.charAt(0)) flag = 0;
for(char i : nested) {
if(nested[i] == curly1.charAt(0) && nested[(i+1)] == box1.charAt(0) || nested[i] == box1.charAt(0) && nested[(i+1)] == p1.charAt(0)) {
flag = 1; }
else if(nested[i] == p2.charAt(0) && nested[(i+1)] == box2.charAt(0) || nested[i] == box2.charAt(0) && nested[(i+1)] == curly2.charAt(0)) {
flag = 1; }
else { flag = 0;}
}
System.out.println(flag);
}
}
如果您需要在循环中使用索引访问某些内容,请使用 for,而不是 foreach(增强的 for)。
现在您正在使用 char
类型的变量 i
访问 nested
数组。变量 i
表示正在迭代的 nested
数组的一个元素。因此,如果您使用此变量访问数组,它的值将被隐式转换为它的 int 表示形式(例如 'a' == 97
),这将导致异常。
在您的情况下,您需要 for 循环,或者将当前索引值保存在其他某个变量中并在每次迭代时递增它,因为您不能使用增强的 for 执行此类索引算法:nested[i + 1]
foreach 循环不提供索引,它提供数组中的元素。所以 char i
是数组中的 chars
之一。在那之后,你说 nested[i]
好像 i
是一个索引,但它不是。 chars
有数值,但很可能数值大于数组的长度。此外,对于 foreach 循环,没有很好的方法来获取迭代后的元素,就像您尝试使用 nested[(i+1)]
一样。为此坚持使用正常的 for
循环。
这是因为在每个版本中,您都试图通过字符元素访问数组索引。
for(字符i:nested)
{
// 这里 i 是一个字符而不是数组索引,所以 nested[i] 没有访问正确的索引。
}
foreach 循环传递 i 中的字符而不是索引到数组中。
你不能用这种循环做你想做的事,因为你不能提前到下一个字符
for(char i : nested) {
if(i == curly1.charAt(0) && ...
In foreach for(char i : nested) loop i is element in array not
index of array
可以先初始化数组索引,然后在for循环中自增;
int index =0;
for(char i : nested) {
index ++;
}
在第一种情况下 (for(int i = 0; i < nested.length; i++)
),变量 i
是数组的索引。
在第二种情况下,您使用 forEach
遍历元素而不是索引的迭代构造。
结构 for(char i : nested)
具有误导性,因为它让您仍然认为 i
是索引,而事实并非如此。如果你写 for(char element : nested)
,那么代码会很清楚,而不是 nested[i]
你应该只使用 element
.
但是,使用这种方法您将无法访问数组中的下一个元素 (nested[i+1]
),因此这种迭代不适合您的情况。
在包含 forEach 循环的行上抛出越界异常,但据我所知,这段代码没有任何问题。 for 循环从 char 数组的元素 0 开始循环直到到达最后一个元素......但是当我使用更长的 for 循环尝试此代码时,即
for(int i = 0; i < nested.length; i++)
代码按预期工作。
为什么在这种情况下for循环有效而forEach循环无效?
public static void main(String[] args) {
String S = "hello";
String curly1 = "{";
String box1 = "[";
String p1 = "(";
String curly2 = "}";
String box2 = "]";
String p2 = ")";
char[] nested = S.toCharArray();
int flag = 0;
if(nested[0] != curly1.charAt(0)) flag = 0;
if(nested[nested.length-1] != curly2.charAt(0)) flag = 0;
for(char i : nested) {
if(nested[i] == curly1.charAt(0) && nested[(i+1)] == box1.charAt(0) || nested[i] == box1.charAt(0) && nested[(i+1)] == p1.charAt(0)) {
flag = 1; }
else if(nested[i] == p2.charAt(0) && nested[(i+1)] == box2.charAt(0) || nested[i] == box2.charAt(0) && nested[(i+1)] == curly2.charAt(0)) {
flag = 1; }
else { flag = 0;}
}
System.out.println(flag);
}
}
如果您需要在循环中使用索引访问某些内容,请使用 for,而不是 foreach(增强的 for)。
现在您正在使用 char
类型的变量 i
访问 nested
数组。变量 i
表示正在迭代的 nested
数组的一个元素。因此,如果您使用此变量访问数组,它的值将被隐式转换为它的 int 表示形式(例如 'a' == 97
),这将导致异常。
在您的情况下,您需要 for 循环,或者将当前索引值保存在其他某个变量中并在每次迭代时递增它,因为您不能使用增强的 for 执行此类索引算法:nested[i + 1]
foreach 循环不提供索引,它提供数组中的元素。所以 char i
是数组中的 chars
之一。在那之后,你说 nested[i]
好像 i
是一个索引,但它不是。 chars
有数值,但很可能数值大于数组的长度。此外,对于 foreach 循环,没有很好的方法来获取迭代后的元素,就像您尝试使用 nested[(i+1)]
一样。为此坚持使用正常的 for
循环。
这是因为在每个版本中,您都试图通过字符元素访问数组索引。
for(字符i:nested) { // 这里 i 是一个字符而不是数组索引,所以 nested[i] 没有访问正确的索引。 }
foreach 循环传递 i 中的字符而不是索引到数组中。 你不能用这种循环做你想做的事,因为你不能提前到下一个字符
for(char i : nested) {
if(i == curly1.charAt(0) && ...
In foreach for(char i : nested) loop i is element in array not index of array
可以先初始化数组索引,然后在for循环中自增;
int index =0;
for(char i : nested) {
index ++;
}
在第一种情况下 (for(int i = 0; i < nested.length; i++)
),变量 i
是数组的索引。
在第二种情况下,您使用 forEach
遍历元素而不是索引的迭代构造。
结构 for(char i : nested)
具有误导性,因为它让您仍然认为 i
是索引,而事实并非如此。如果你写 for(char element : nested)
,那么代码会很清楚,而不是 nested[i]
你应该只使用 element
.
但是,使用这种方法您将无法访问数组中的下一个元素 (nested[i+1]
),因此这种迭代不适合您的情况。