我不能这样修改List的元素:
for (String s : list)
{
s = "x" + s;
}
执行后,此列表的此代码元素保持不变 如何通过最简单的方式修改List来实现迭代。
答案 0 :(得分:13)
由于String
对象是不可变的,因此您无法更改迭代的值。此外,您无法修改在此循环中迭代的列表。执行此操作的唯一方法是使用标准循环迭代列表索引或使用ListIterator
接口:
for (int i = 0; i < list.size(); i++)
{
list.set(i, "x" + list.get(i));
}
for (ListIterator i = list.listIterator(); i.hasNext(); )
{
i.set("x" + i.next());
}
答案 1 :(得分:3)
字符串是不可变的野兽,因此我可以建议遵循这一理念并创建新列表而不是修改一个:
List<String> mappedList = new ArrayList<String>();
for (String s : list) {
mappedList.add("x" + s);
}
我相信,这将使您的代码更易于理解和维护。
答案 2 :(得分:3)
这样的事情应该可以胜任:
public static void main(String[] args) throws Exception {
final List<String> lst = Arrays.asList("a", "b", "c");
for(final ListIterator<String> iter = lst.listIterator(); iter.hasNext(); ) {
final String s = iter.next();
iter.set(s + "x");
}
System.out.println(lst);
}
答案 3 :(得分:2)
Java字符串是不可变的,因此无法修改它们。此外,如果要修改列表,请使用迭代器接口。
答案 4 :(得分:2)
正如其他人所指出的那样:
s = "x" + s
将创建一个新字符串(不会包含在列表中)s
也是局部变量,当分配给它时,不会影响列表中包含的值。在这种情况下,解决方案是使用StringBuilder
表示您可以实际修改的字符串,或使用ListIterator
作为@Michael Borgwardt和@jarnbjo指出。
使用StringBuilder
:
List<StringBuilder> someStrings = new LinkedList<StringBuilder>();
someStrings.add(new StringBuilder("hello"));
someStrings.add(new StringBuilder("world"));
for (StringBuilder s : someStrings)
s.insert(0, "x");
使用ListIterator
:
List<String> someStrings = new LinkedList<String>();
someStrings.add("hello");
someStrings.add("world");
for (ListIterator<String> iter = someStrings.listIterator(); iter.hasNext();)
iter.set("x" + iter.next());
答案 5 :(得分:1)
在循环中,您只需修改String的本地副本。更好的选择是使用列表的迭代器,并替换列表的当前位置。
编辑,糟糕,慢慢来。
答案 6 :(得分:1)
您无法以这种方式修改String
的{{1}}元素,但List
可以正常使用:
StringBuilder
其他原始vs参考情况和for-each循环也是如此。在循环中,for (StringBuilder sb : list) sb.append("x");
是不可变的,但其中的项的状态不是 - 基元(如Iterable
)没有状态,因此您只修改本地副本,但引用可以有状态,因此你可以通过他们可能拥有的任何mutator方法改变它们(例如,String
)。