我试图找到一种有效的方法来检查String中是否有任何重复的字符。例如,我怎样才能最有效地检查String是否包含多个句点?
我的尝试:
if (str.indexOf(".") > -1) { //if period '.' exists
if (str.substring(str.indexOf(".") + 1).indexOf(".") > -1) { //if a second period '.' exists
return true;
}
}
return false;
编辑:通过有效我的意思是快速和小。是否存在快速,单行,可读的策略?
答案 0 :(得分:3)
首先,不要多次计算相同的值(str.indexOf(".")
)。另外,创建一次性子串也很昂贵。
还有第二个indexOf()
采用起始索引
int dot = str.indexOf(".");
if (dot > -1 && str.indexOf(".", dot + 1) > -1)
return true;
return false;
您可以将此缩短为
int dot = str.indexOf(".");
return dot > -1 && str.indexOf(".", dot + 1) > -1;
有两种不同的indexOf
indexOf(int ch)
和indexOf(int ch, int fromIndex)
indexOf(String str)
和indexOf(String str, int fromIndex)
我不知道,但我认为,搜索单个字符比搜索字符串要快。所以使用前者可能是更快的选择。
答案 1 :(得分:1)
问题可以在Java 8中以非常紧凑的方式解决 - 或者确切地说,是2个子问题。
1)检查是否有重复的字符。
boolean static containsRepetitions(String s) {
return s.chars().mapToObj(c -> c).collect(Collectors.toSet()).size() != s.length();
}
2)检查是否重复指定的字符。
boolean static isCharRepeated(String s, char c) {
return s.chars().filter(x -> x == c).count() > 1;
}
答案 2 :(得分:0)
您可以从以下代码开始:
private static final Pattern pat = Pattern.compile(".*?\\..*\\..*");
void yourMethod() {
System.out.println(pat.matcher("yourString").matches());
}
您还可以修改正则表达式以查找其他重复的字符。