我正在研究java enhanced for loop和Iterator之间的区别。
我从网上得到了以下声明
for-each循环几乎可以肯定是Java 5中最新的流行功能。它的工作原理是因为它增加了抽象级别 - 而不是必须表达如何围绕列表循环的低级细节或数组(使用索引或迭代器),开发人员只是声明他们想循环,语言负责其余部分。但是,只要开发人员需要访问索引或删除项目,所有好处就会丢失。
我无法理解下面这行
一旦开发人员需要访问索引
,所有好处就会丢失
在增强的for循环中,how is it possible to access the index
??
附加一个示例程序,如果有人能告诉我在这种情况下如何访问索引会更好
package com;
import java.util.ArrayList;
import java.util.Iterator;
public class Tester {
public static void main(String args[]) {
ArrayList<String> list = new ArrayList<String>();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
list.add("Five");
list.add("Six");
list.add("Seven");
StringBuffer sb = new StringBuffer();
// From here I want to change if this can be tuned anyway
for (String result : list) {
if (result.equals("One") || result.equals("Two")) {
sb.append("1.0");
}
if (result.equals("Three")) {
sb.append("3.0");
} else {
sb.append("4.0");
}
}
System.out.println(sb.toString());
}
}
答案 0 :(得分:2)
在增强的for循环中,如何访问索引?
也许你不能明确地做到这一点。但是你可以在循环上方初始化一个局部变量,并在循环体内增加它。这样它就可以成为索引的代理。
在JSTL的forEach
循环中,您可以拥有索引句柄,而不是Java的增强for循环。如果您需要使用索引,最好使用正统的for
循环。
这个循环:
for(int i=0;i<list.size();i++) { String str = list.get(i); }
可简化为此
for(String str:list) {}
即便如此
int count = 0;
for(String str : list) {
// your code
count++;
}
答案 1 :(得分:2)
在for-each循环中,无法访问索引,您必须维护一个计数器。
请注意,某些集合不是随机访问,这意味着您无论如何也无法使用索引。
答案 2 :(得分:1)
在for-each
循环中,无法找到当前项的索引(没有列表的.indexOf(),或者明确地跟踪它)据我所知,所有这一切我要说的是,如果你需要访问索引,那么就不应该使用for-each循环。
for-each循环点是抽象出索引的思想,只关注你想要做的事情的核心 - 迭代这个东西。无论是通过索引还是其他方面,如果您使用for-each循环都无关紧要。
答案 3 :(得分:1)
使用计数器变量(在这种情况下,你最好使用正常的for
循环),或使用ArrayList中的indexOf成员函数。
你最好选择使用常规for循环,因为我相信indexOf比保留当前索引的计数器变量要贵得多。
答案 4 :(得分:1)
实际上,您可以使用在增强型for循环之外定义的局部变量来计算循环运行的次数
像:
int count = 0;
Array <Integer> int_array = new ArrayList<Integer>()
int_array.add(1);
int_array.add(2);
int_array.add(3);
for (Integer int_element : int_array)
{
//some functionality codes here
// ...
//update the count
count ++;
}