在String上使用子字符串的替代方法

时间:2013-10-09 16:04:08

标签: java

我有一个包含下划线的字符串,如下所示:

  

123445_Lisick

我想删除下划线后字符串中的所有字符。我已经尝试了下面的代码,它正在工作,但还有其他方法可以做到这一点,因为我需要将这个逻辑放在for循环中以从ArrayList中提取元素。

public class Test {
    public static void main(String args[]) throws Exception {
        String str = "123445_Lisick";
        int a = str.indexOf("_");
        String modfiedstr = str.substring(0, a);
        System.out.println(modfiedstr);
    }
}

3 个答案:

答案 0 :(得分:5)

另一种方法是使用split方法。

String str = "123445_Lisick";
String[] parts = string.split("_");
String modfiedstr = parts[0];

我不认为这真的会给你带来任何好处。你正在使用的方法确实没有错。

答案 1 :(得分:0)

你的方法很好。虽然API文档中没有明确说明,但我认为可以安全地假设indexOf(char)将在O(n)时间内运行。由于您的字符串是无序的,并且您不知道下划线apriori的位置,因此您无法避免此线性搜索时间。完成搜索后,将需要提取子字符串以供将来处理。通常可以安全地假设这样的简单操作使用的语言相当精细,库函数将得到优化。

但请注意,您隐含的假设是

  • 字符串
  • 中将存在下划线
  • 如果字符串中有多个下划线,则除了第一个下划线之外的所有下划线都应包含在输出

如果这些假设中的任何一个都不能保持,那么您需要进行调整以处理这些情况。在任何一种情况下,你至少应该防御性地检查从indexAt(char)返回的-1,表明'_'不在字符串中。假设在这种情况下需要整个String,你可以使用这样的东西:

public static String stringAfter(String source, char delim) {
     if(source == null) return null;
     int index = source.indexOf(delim);
     return (index >= 0)?source.substring(index):source;
}

答案 2 :(得分:0)

你也可以使用类似的东西:

public class Main {
  public static void main(String[] args) {
    String str = "123445_Lisick";
    Pattern pattern = Pattern.compile("^([^_]*).*");
    Matcher matcher = pattern.matcher(str);
    String modfiedstr = null;
    if (matcher.find()) {
      modfiedstr = matcher.group(1);
    }
    System.out.println(modfiedstr);
  }
}

正则表达式从输入字符串的开头对模式进行分组,直到找到不是_的字符。

然而,正如蜥蜴写的@Bill,我不认为你现在这样做的方法有什么问题。我会像你那样做。