检查String中是否有任何char重复项的最有效方法是什么?

时间:2016-10-01 19:01:46

标签: java string

我试图找到一种有效的方法来检查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;

编辑:通过有效我的意思是快速和小。是否存在快速,单行,可读的策略?

3 个答案:

答案 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

我不知道,但我认为,搜索单个字符比搜索字符串要快。所以使用前者可能是更快的选择。

答案 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());
}

您还可以修改正则表达式以查找其他重复的字符。