Java 在字符串ArrayList中查找并替换

Java 在字符串ArrayList中查找并替换,java,Java,你可以编译一个 Pattern p=Pattern.compile(“,”); 对于(int-loopIndex2=0;loopIndex2

你可以编译一个

Pattern p=Pattern.compile(“,”);
对于(int-loopIndex2=0;loopIndex2
您可以编译一个

Pattern p=Pattern.compile(“,”);
对于(int-loopIndex2=0;loopIndex2
有多种方法可以改善这一点。当然,您需要决定您可以做哪些权衡:

  • 如果字符串很小,使用正则表达式会增加太多开销。你 可以首先检查角色是否是目标的一部分并跳过它 如果不使用
    if(!contents.contains(“,”){next;}
    This循环 通过你的琴弦,对于小琴弦来说还不错。如果 字符串很小,您也可以自己扫描字符串并替换 “就地”(不是真正就地,因为字符串是不可变的,所以您需要创建一个新字符串,但您知道了)
  • 如果字符串足够大,正则表达式可能是一个选项,因此请遵循 @Elliott Frisch的答案和保存 循环中的模式
  • 您没有解释为什么要添加带有逗号的字符串。 你可以为你的列表创建一个包装器,在添加的时候你可以去掉它 在将不需要的字符添加到列表本身之前,请先清除这些字符。在…上 同样的想法是,你可以通过按下键来用逗号“标记”字符串 它们的位置指向另一个数据结构,例如堆栈,以便 循环不需要遍历整个列表,只需“跳转” 直接安装到元件上并更换它们。如果列表 它很大

  • 当然,您需要在所有情况下进行测试以验证。如果您的数据集非常小,并且没有真正的需求,那么就编写最简单、最直观的代码

    有多种方法可以改善这一点。当然,您需要决定您可以做哪些权衡:

  • 如果字符串很小,使用正则表达式会增加太多开销。你 可以首先检查角色是否是目标的一部分并跳过它 如果不使用
    if(!contents.contains(“,”){next;}
    This循环 通过你的琴弦,对于小琴弦来说还不错。如果 字符串很小,您也可以自己扫描字符串并替换 “就地”(不是真正就地,因为字符串是不可变的,所以您需要创建一个新字符串,但您知道了)
  • 如果字符串足够大,正则表达式可能是一个选项,因此请遵循 @Elliott Frisch的答案和保存 循环中的模式
  • 您没有解释为什么要添加带有逗号的字符串。 你可以为你的列表创建一个包装器,在添加的时候你可以去掉它 在将不需要的字符添加到列表本身之前,请先清除这些字符。在…上 同样的想法是,你可以通过按下键来用逗号“标记”字符串 它们的位置指向另一个数据结构,例如堆栈,以便 循环不需要遍历整个列表,只需“跳转” 直接安装到元件上并更换它们。如果列表 它很大

  • 当然,您需要在所有情况下进行测试以验证。如果您的数据集非常小,并且没有真正的需求,那么就编写最简单、最直观的代码

    如果您想用另一个字符替换一个字符,那么一个改进可以是使用
    replace(',','Q')
    而不是
    replaceAll(“,”,“Q”)
    ,这将不必要地涉及正则表达式引擎。同样,也不需要像
    loopIndex2
    那样命名循环索引,简单的
    i
    就足够了。“有没有可能优化上面的代码?”如果你的代码有效,那么你应该问这个问题。不可变对象的列表不能更新,除非使用“获取更改集”范例Laune,因此如果我们使用StringBuilder而不是字符串,我们可能可以内联地进行更新?因此,可能需要将方法参数更改为ArrayList arrLst。不确定它是否有效。让我试试。
    StringBuilder
    没有替换方法,因此即使您将列表设置为通用的
    StringBuilder
    ,您仍然需要将其转换为
    String
    。如果您想用一个字符替换另一个字符,那么一个改进可以是使用
    replace(','Q')
    而不是
    replaceAll(,,“,,,,'Q')
    这将不必要地涉及正则表达式引擎。同样,也不需要像
    loopIndex2
    那样命名循环索引,简单的
    i
    就足够了。“有没有可能优化上面的代码?”如果你的代码有效,那么你应该问这个问题。不可变对象的列表不能更新,除非使用“获取更改集”范例Laune,因此如果我们使用StringBuilder而不是字符串,我们可能可以内联地进行更新?因此,可能需要将方法参数更改为ArrayList arrLst。不确定它是否有效。让我试试。
    StringBuilder
    没有替换方法,因此即使您将列表设置为通用的
    StringBuilder
    ,您仍然需要将其转换为
    String
    @MaheshaPadyana,我相信是这样的,但这可能取决于您的平台和版本。@ElliottFrisch:replaceAll
    就是这样做的。所以我认为没有difference@Cratylus是的,但它会在每次循环迭代中编译模式,这会编译模式一次。@MaheshaPadyana我相信是的,但这可能取决于您的平台和版本。@ElliottFrisch:replaceAll就是这样做的。所以我认为没有difference@Cratylus是的,但是它在每个循环迭代中编译模式,这会编译模式一次。
    public static int preaparePatternForJFugue(ArrayList <String> arrLst) {
    
        String contents;
        for(int loopIndex2=0;loopIndex2<arrLst.size();loopIndex2++) {
            contents=arrLst.get(loopIndex2);
            contents=contents.replaceAll(",", "Q");
            arrLst.set(loopIndex2, contents);
        }
    }
    
    arrLst.set(loopIndex2, arrLst.get(loopIndex2).replaceAll(",", "Q"));
    
    Pattern p = Pattern.compile(",");
    for (int loopIndex2 = 0; loopIndex2 < arrLst.size(); loopIndex2++) {
        Matcher matcher = p.matcher(arrLst.get(loopIndex2));
        arrLst.set(loopIndex2, matcher.replaceAll("Q"));
    }