我有一个包含下划线的字符串,如下所示:
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);
}
}
答案 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,我不认为你现在这样做的方法有什么问题。我会像你那样做。