我有一个循环传统,我只是想知道每个循环的等效循环是什么。
for (int i = 0; i < words.size(); i++)
{
words.set(i, words.get(i).toUpperCase());
}
另外,对于那些想知道的人来说,单词是String类型的arrayList。
答案 0 :(得分:3)
for-each构造不允许您设置元素。这是因为它提供的语法糖完全隐藏了Iterator<E>
。
for (String word : words)
...
相当于
for (Iterator<String> it = words.iterator(); it.hasNext(); /**/) {
String word = it.next();
...
}
如果String
实例是可变对象,这可以起作用,这样您可以在不修改引用的情况下修改内容,但事实并非如此。为了能够用for-each做你需要的东西,你需要一个包装类,例如:
List<AtomicReference<String>> words = ...;
for (AtomicReference<String> word : words)
word.set(word.get().toUpperCase());
答案 1 :(得分:3)
带索引的for
循环很好,但您也知道,您还可以使用ListIterator
来set
替换当前项:
for (ListIterator<String> iterator = words.listIterator(); iterator.hasNext();) {
String word = iterator.next();
iterator.set(word.toUpperCase());
}
这不是增强的for循环,但非常接近于非数组Iterable
的增强for循环。
答案 2 :(得分:1)
也许你会对java 8的方式感兴趣:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Class {
public static void main(String... args) {
List<String> words = new ArrayList<String>();
words.add("hello");
words = words.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println(words);
}
}
答案 3 :(得分:1)
我很惊讶没有人使用增强的for循环指出以下结构:
int i = 0;
for (String str : words) {
words.set(i++, str.toUpperCase());
}
现在,除非words
是RandomAccess
的实例,否则这非常严重且效率低下;我更喜欢使用ListIterator
approach proposed by Weston。
这适用于ArrayList
和LinkedList
等,而不是ConcurrentModificationException
,因为只会在structural modification of the list之后抛出:
结构修改是添加或删除一个或多个元素或显式调整后备数组大小的任何操作;仅设置元素的值不是结构修改。
请注意,对于一般List
实现没有安全的方法(包括原始问题中的基本for循环):set
是一个可选操作,你无法判断它是否是在没有尝试的情况下为List
实施。