查找和替换唱歌。字符。在 ArrayList<String> 元素中

Posted

技术标签:

【中文标题】查找和替换唱歌。字符。在 ArrayList<String> 元素中【英文标题】:find & replace sing. char. in an ArrayList<String> element 【发布时间】:2012-10-02 21:32:51 【问题描述】:

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

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

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

【问题讨论】:

我不明白你第一次尝试有什么问题。 replace 不会修改现有字符串。您需要重新分配新字符串。另外它也不会修改列表。您需要创建一个新列表。 【参考方案1】:

第一种方法有什么问题? 如果您删除 else 块,它应该可以工作('i' 已经被 for 循环递增)。 另外,您的第二种方法没有意义,您没有在内部 for 循环中使用 i ,除了增加它,这不应该是必需的(是吗?)

【讨论】:

第一种方法会失败,因为字符串是不可变的,他没有替换列表中的值 哦,是的,你是对的!需要将新字符串放回(替换)列表中。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

其次,您的替换不会修改现有列表。您需要将新字符串设置到现有位置,因为您使用的是传统的 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 我喜欢使用两个列表作为示例,但是您已经更新了代码,不过如此,很好。 @MadProgrammer。我会再次添加它。虽然我们可以将它设置到现有列表本身。所以。 我只是喜欢您的示例提供列表之间的比较的想法,认为它很整洁:)【参考方案4】:

我认为您的问题与字符串不可变(即内容无法更改)这一事实有关。

你的第一个例子中的这个语句实际上并没有做任何事情......

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

【讨论】:

真的,我得做更多的数学:P【参考方案5】:

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

第 1 点StringImmutable,您正在尝试使用 someList.get(i).replace(someString, otherString); 修改字符串,这将起作用,但不会反映在您的 someList 中,以反映您的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);

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

【讨论】:

不是你回答错了(不是),但是为什么是对的呢? ;) @MadProgrammer,String 是不可变的,因此它不会反映在 someList.get(i).replace(someString, otherString);线。我还添加了一个不可变的链接 将解释添加到您的答案中,我会给您投票;) @MadProgrammer,非常感谢您提出的添加解释的建议。 好多了:D - 就个人而言,最好尝试教一些人钓鱼【参考方案6】:

你可以试试这样的:

    首先将值存储在 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);
    
    
    

【讨论】:

【参考方案7】:

我知道这个问题已经很老了,但我只是在寻找同样的东西,并想我会为了其他人而添加我发现的东西。

我发现最简单的方法是使用 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"));
    

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

【讨论】:

以上是关于查找和替换唱歌。字符。在 ArrayList<String> 元素中的主要内容,如果未能解决你的问题,请参考以下文章

C++string字符串查找替换比较提取插入和删除

C++编程,查找字符串子串并替换。

notepad+++查找和替换 不能用

linux几种常见的文件内容查找和替换命令

怎样在emacs中进行多文件字符串查找/替换

linux基础命令之:vi模式下查找和替换