我有兴趣迭代(re:查找和替换目的), 说:
List<String> someList = new ArrayList<String>();
其中someList已在早期方法中填充, 并且包括,仅举几个元素,以时尚的方式, 称之为[a:bX,b:Xc],
其中感兴趣的查找和替换字符串是:
String someString = "X";
String otherString = "Y";
String contentsTBD = "";
现在,理想情况下我认为我可以像某样迭代某些List:
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);
}
然后很快意识到这是荒谬的 我对我的提法丢失了。任何建议都会非常有用。 谢谢。
答案 0 :(得分:9)
首先,您不会将替换字符串存储在任何位置。随风而逝。
其次,您的替换不会修改现有列表。您需要将新字符串设置为现有位置,因为您使用的是传统的for循环。 或,您可以拥有一个新列表,并将add
修改后的值添加到该列表中。
请记住,由于Java中的String
是不可变的,因此String类的所有方法都返回一个新字符串。他们不会修改现有的。因此,您需要将返回的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 :(得分:7)
已编辑添加了解释,
第1点:String
为Immutable
,您尝试使用someList.get(i).replace(someString, otherString);
修改字符串,但该字符串不会反映在someList
内{1}},要反映您的someList,您必须调用someList.set(i)
第2点:
由于else
incrementing
i
,因此for loop
阻止无效
试试这个。
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);
了解java immutable
中的Immutable如何工作答案 2 :(得分:5)
我知道这个问题已经很老了,但我只是在寻找同样的东西,并认为我为了别人而添加了我发现的东西。
我发现这样做的最简单方法是使用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"));
}
}
它不需要使用很好的索引。
答案 3 :(得分:2)
问题是String是不可变的,因此它不会在List中就地修改,你需要更新它:
someList.set(i, someList.get(i).replace(someString, otherString);
您也不需要else块,或者您将跳过一个元素。
答案 4 :(得分:2)
我认为你的问题与字符串是不可变的事实有关(也就是说,内容不能改变)。
你的第一个例子中的这个陈述实际上并没有做任何事......
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
答案 5 :(得分:0)
第一种方法有什么问题?
如果你移除了else块,它应该有效('i'已经通过for循环递增)。
另外,你的第二种方法没有意义,你没有在内部for循环中使用i,除了增加它,这不应该是必需的(是吗?)
答案 6 :(得分:0)
您可以尝试这样的事情:
在使用Generics时使用Iterator。
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);
}