Java 检查字符串中是否存在任何重复字符的最有效方法是什么?

Java 检查字符串中是否存在任何重复字符的最有效方法是什么?,java,string,Java,String,我试图找到一种有效的方法来检查字符串中是否有重复的字符。例如,如何最有效地检查字符串是否包含多个句点 我的尝试: if (str.indexOf(".") > -1) { //if period '.' exists if (str.substring(str.indexOf(".") + 1).indexOf(".") > -1) { //if a second period '.' exists return true; } } return fa

我试图找到一种有效的方法来检查字符串中是否有重复的字符。例如,如何最有效地检查字符串是否包含多个句点

我的尝试:

if (str.indexOf(".") > -1) { //if period '.' exists
    if (str.substring(str.indexOf(".") + 1).indexOf(".") > -1) { //if a second period '.' exists
        return true;
    }
}
return false;

编辑:我所说的高效是指快速和小型。是否有一种快速、一行、易读的策略?

首先,不要多次计算相同的值(
str.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


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

首先,不要多次计算相同的值(
str.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


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

您可以从以下代码开始:

private static final Pattern pat = Pattern.compile(".*?\\..*\\..*");
void yourMethod() {
    System.out.println(pat.matcher("yourString").matches());
}

您还可以修改regex以查找另一个重复的字符。

您可以从以下代码开始:

private static final Pattern pat = Pattern.compile(".*?\\..*\\..*");
void yourMethod() {
    System.out.println(pat.matcher("yourString").matches());
}

您还可以修改regex以找到另一个重复的字符。

这个问题可以在Java 8中以非常简洁的方式解决,或者更准确地说,这两个子问题

1) 检查是否有任何字符重复

boolean static containsRepetitions(String s) {
    return s.chars().mapToObj(c -> c).collect(Collectors.toSet()).size() != s.length();
}
boolean static isCharRepeated(String s, char c) {
    return s.chars().filter(x -> x == c).count() > 1;
}
2) 如果指定的字符重复,则进行检查

boolean static containsRepetitions(String s) {
    return s.chars().mapToObj(c -> c).collect(Collectors.toSet()).size() != s.length();
}
boolean static isCharRepeated(String s, char c) {
    return s.chars().filter(x -> x == c).count() > 1;
}

这个问题可以在Java8中以非常简洁的方式来解决,或者更准确地说,这两个子问题

1) 检查是否有任何字符重复

boolean static containsRepetitions(String s) {
    return s.chars().mapToObj(c -> c).collect(Collectors.toSet()).size() != s.length();
}
boolean static isCharRepeated(String s, char c) {
    return s.chars().filter(x -> x == c).count() > 1;
}
2) 如果指定的字符重复,则进行检查

boolean static containsRepetitions(String s) {
    return s.chars().mapToObj(c -> c).collect(Collectors.toSet()).size() != s.length();
}
boolean static isCharRepeated(String s, char c) {
    return s.chars().filter(x -> x == c).count() > 1;
}

对你来说,有效意味着什么?快还是小?你说的“效率最高”是什么意思?如果要优化时间,可以创建int[256],并计算每个字符的出现次数。如果你想优化内存,那么另一种算法会应用,等等。@arnauddenoylle
int[256]
不够长,因为Java
char
是一个16位的值,而且对于这个问题来说,它的宽度也不必要,因为你最多只能数到两个
bool[0x110000]
可以满足整个Unicode范围的要求。对于您的编辑来说,fast与小的非常不同。考虑到java编译器没有大量的内置代码,单行策略可能会更慢optimization@msrd0如果您想简洁,请省略第一部分,只需选中
str.indexOf(“.”)=str.lastIndexOf(“.”)
如果
indexOf()
返回-1,则
lastIndexOf()
也将返回-1。但这并不是最快的,在最坏的情况下,这会扫描你的字符串两次。在你的情况下,有效意味着什么?快还是小?你说的“效率最高”是什么意思?如果要优化时间,可以创建int[256],并计算每个字符的出现次数。如果你想优化内存,那么另一种算法会应用,等等。@arnauddenoylle
int[256]
不够长,因为Java
char
是一个16位的值,而且对于这个问题来说,它的宽度也不必要,因为你最多只能数到两个
bool[0x110000]
可以满足整个Unicode范围的要求。对于您的编辑来说,fast与小的非常不同。考虑到java编译器没有大量的内置代码,单行策略可能会更慢optimization@msrd0如果您想简洁,请省略第一部分,只需选中
str.indexOf(“.”)=str.lastIndexOf(“.”)
如果
indexOf()
返回-1,则
lastIndexOf()
也将返回-1。但这并不是最快的,在最坏的情况下,这会扫描你的字符串两次。正则表达式肯定不是最快的方法,即使在现代机器上,简单的正则表达式你也不应该注意到difference@msrd0您是对的,我研究了String.indexOf()方法,它可能是最好的选择。然而,使用正则表达式很容易找到任何副本。正则表达式肯定不是最快的方法,即使在现代机器上,而且简单的正则表达式也不应该引起注意difference@msrd0您是对的,我研究了String.indexOf()方法,它可能是最好的选择。然而,使用正则表达式很容易找到任何重复项。