我有兴趣遍历(re:查找和替换目的),说:
List<String> someList = new ArrayList<String>();
其中 someList 已在较早的方法中填充,并且由,比如说几个元素组成,以时尚的方式,称之为 [a:bX, b:Xc],
其中,查找和替换感兴趣的字符串是:
String someString = "X";
String otherString = "Y";
String contentsTBD = "";
现在,理想情况下,我认为我可以像这样迭代某个列表:
public void readAndReplace() {
for (int i = 0; i < someList.size(); i++) {
if (someList.get(i).contains(someString)) {
someList.get(i).replace(someString, otherString);
} else {
++i;
}
}
System.out.print(someList);
}
其中打印输出应为:
[a:bY, b:Yc]
然后,我认为这可能会起作用:
public void readAndReplace() {
for (String s : someList) {
contentsTBD += s;
}
for (int i = 0; i < contentsTBD.length(); i++) {
if (contentsTBD.contains(someString)) {
contentsTBD.replaceAll(someString, otherString);
} else {
++i;
}
}
System.out.print(contentsTBD);
}
但后来很快意识到这是无稽之谈,因为我对我的提及丢失了。 任何建议都会很有帮助。谢谢。
-
首先,您不会将替换字符串存储在任何地方。它随风而去。
-
其次,替换不会修改现有列表。您需要将新字符串设置为现有位置,因为您使用的是传统的 for 循环。或者,您可以有一个新列表,并将修改后的值
add
到该列表。 -
请记住,由于 Java 中的
String
是不可变的,因此 String 类的所有方法都返回一个新字符串。它们不会修改现有的。因此,您需要将返回的字符串重新分配给一个新的字符串。
试试这个代码: -
public void readAndReplace()
{
// You can also create a new list out of the existing list.
// That way, you won't need to modify the existing one.
List<String> newList = new ArrayList<String>();
for(int i = 0; i < someList .size(); i++)
{
if(someList.get(i).contains(someString))
{
newList.add(someList.get(i).replace(someString, otherString));
//someList.set(i, someList.get(i).replace(someString, otherString));
} else {
// If it not contains `someString`, add it as it is to newList
newList.add(someList.get(i));
}
}
System.out.println(someList); // Original
System.out.println(newList); // New List
}
编辑添加了解释,在疯狂程序员的建议下,
第 1 点:String
Immutable
,并且您正在尝试使用someList.get(i).replace(someString, otherString);
修改字符串,这些字符串将起作用,但不会反映在您的someList
中,要反映您的 someList,您必须调用someList.set(i)
要点 2:您的else
块毫无用处,因为您已经在for loop
内incrementing
i
试试这个。
String oldStr="";
for (int i = 0; i < someList.size(); i++) {
if (someList.get(i).contains(someString)) {
oldStr = someList.get(i).replace(someString, otherString);
someList.set(i, oldStr);
}
}
System.out.print(someList);
了解 Immutable 在 Java 中的工作原理 Immutable
我知道这个问题已经很老了,但我只是在寻找同样的东西,并认为我会为了其他人而添加我发现的东西。
我发现最简单的方法是使用 ListIterator 类,它是 Iterator 的一个子接口,专门用于处理列表。 它使这种操作非常简单:
public void replace(List<String> list) {
ListIterator<String> it = list.listIterator();
while(it.hasNext()) {
it.set(it.next().replace("old_text","new_text"));
}
}
它消除了使用索引的需要,这很好。
问题是 String 是不可变的,因此它不会在您的列表中就地修改,您需要更新它:
someList.set(i, someList.get(i).replace(someString, otherString);
你也不需要 else 块,否则你会跳过另一个元素。
您的问题与字符串不可变的事实有关(也就是说,无法更改内容)。
您的第一个示例中的此语句实际上没有任何作用......
someList.get(i).replace(someString, otherString);
我可能会做类似的事情
for(int i = 0; i < someList .size(); i++)
{
String value = someList.get(i);
if(value.contains(someString))
{
value = value.replace(someString, otherString);
someList.set(i, value);
}
}
另外,我不知道您为什么在 else 条件下增加i
第一种方法有什么问题?
如果您删除 else 块("i"已经按 for 循环递增),它应该会起作用。
另外,您的第二种方法没有意义,您没有在内部 for 循环中使用 i,除了递增它,这不应该是必需的(是吗?
你可以尝试这样的事情:
- 首先将值存储在 ArrayList 中。
-
像使用泛型一样使用迭代器。
List<String> somelist = new ArrayList<String>(); someList.add("Y"); someList.add("X"); someList.add("Z"); Iterator itr = someList.iterator(); while(itr.hasNext){ String a = itr.next(); String b = "Y"; if(a.contains(b)){ String c = b.replace("A"); System.out.println(c); } else{ System.out.println(b); }