8

我有兴趣迭代(重新:查找和替换目的),说:

List<String> someList = new ArrayList<String>();

其中 someList 已经在较早的方法中填充,并且仅由几个元素组成,称为 [a:bX, b:Xc],

感兴趣的查找和替换字符串在哪里,比如说:

String someString = "X";
String otherString = "Y";
String contentsTBD = "";

现在,理想情况下,我认为我可以像这样迭代 someList :

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);
}

但很快意识到这是荒谬的,因为我失去了对我的提及。任何建议都会非常有帮助。谢谢你。

4

7 回答 7

9
  • 首先,您没有将替换的字符串存储在任何地方。它随风而去。

  • 其次,您的替换不会修改现有列表。您需要将新字符串设置到现有位置,因为您使用的是传统的 for 循环。或者,您可以有一个新列表,并add修改该列表的值。

  • 请记住,由于String在 Java 中是不可变的,所以 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

    }
于 2012-10-12T05:46:54.163 回答
7

在MadProgrammer的建议下,编辑添加了解释,

第 1 点StringImmutable,并且您正在尝试修改字符串,someList.get(i).replace(someString, otherString);这将起作用,但不会反映在您的内部someList,以反映您的 someList 您必须调用someList.set(i)

第 2 点:你的else方块没用,因为你已经incrementingi里面了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);

看看 Immutable 在 java immutable中是如何工作的

于 2012-10-12T05:52:02.137 回答
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"));
    }
}

它消除了使用索引的需要,这很好。

于 2016-08-17T14:42:39.463 回答
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);

    }
}

另外,我不知道你为什么i在 else 条件下增加

于 2012-10-12T05:47:24.540 回答
2

问题是 String 是不可变的,因此它没有在您的 List 中就地修改,您需要更新它:

someList.set(i, someList.get(i).replace(someString, otherString);

您也不需要 else 块,否则您将再跳过一个元素。

于 2012-10-12T05:45:27.067 回答
0

第一种方法有什么问题?
如果您删除 else 块,它应该可以工作('i' 已经被 for 循环递增)。

此外,您的第二种方法没有意义,您没有在内部 for 循环中使用 i ,除了增加它,这不应该是必需的(是吗?)

于 2012-10-12T05:37:01.380 回答
0

你可以尝试这样的事情:

  1. 首先将值存储在 ArrayList 中。
  2. 在使用泛型时使用迭代器。

    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);
    
    }
    
于 2012-10-12T06:08:45.430 回答