0

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

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

3 回答 3

5

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

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

我不认为这真的能买到任何东西。您使用的方法确实没有问题。

于 2013-10-09T16:07:27.197 回答
0

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

但是请注意,您正在做出一个隐含的假设,即

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

如果这些假设中的任何一个并不总是成立,那么您将需要进行调整以处理这些情况。在任何一种情况下,您至少应该防御性地检查从 indexAt(char) 返回的 -1 是否表明 '_' 不在字符串中。假设在这种情况下需要整个字符串,您可以使用如下内容:

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;
}
于 2013-10-09T16:25:30.867 回答
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 the lizard 所写,我认为您现在执行的方法没有任何问题。我会像你那样做。

于 2013-10-09T17:01:27.157 回答