Java - 如何检查字符串中的重复字符?

Ric*_*ich 4 java regex string function duplicates

我需要编写一个函数来检查字符串的重复值并返回唯一字符的数量.如果计数大于3,则应返回true.如果计数小于3,则应为假.这是我一直在尝试的(注意我是java的新手)

private boolean isFormatValid(String password) {
    CharSequence inputStr = password;
    int length = inputStr.length();
    int numberDups = 0;

    for(int i=0; i < length; ++i) {
        Pattern pattern = Pattern.compile("(.)(?=.*?\1){1,20}");
        Matcher matcher = pattern.matcher(inputStr);
        numberDups += 1;
    }
    if (numberDups < 3) {
        return false;
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我试图使用正则表达式,因为它被认为可能更容易.但如果我能在没有正则表达式的情况下实现这一目标,我会更快乐.

这是什么意思?

private boolean isFormatValid(String password) {
    int length = inputStr.length();
    int numberChars = 0;

    for(int i=0; i < length; ++i) {
                int index = password.indexOf(i);
        CharArray[i] = charAt(i);   
    }
}
Run Code Online (Sandbox Code Playgroud)

我觉得这甚至不是正确的......

Ada*_*ski 6

你几乎就在那里.您可以使用索引:而不是使用正则表达式:使用索引i来索引String和读取特定字符charAt(int).

然后,您需要一个数据结构来跟踪每个角色的出现次数.我建议使用a HashMap来表示Character你已经读过的地图键,地图值是出现Integer次数的计数.


Ala*_*ore 1

我认为示例代码中的变量numberDups命名错误,这让一些人感到困惑。该变量应该表示不同字符的数量,不是吗?也就是说,如果字符串是abcabc数字,则为3,对于字符串,aaaaaaaaa则为1

既然如此,最简单的解决方案就是,正如其他人所说,使用 Set。事实上你的代码已经差不多了;只需删除该numberDups计数器并将其替换为 a HashSet<Character>,如下所示:

static boolean isFormatValid(String password) {
    CharSequence inputStr = password;
    int length = inputStr.length();
    Set<Character> uniqueChars = new HashSet<Character>();

    for(int i=0; i < length; ++i) {
        uniqueChars.add(inputStr.charAt(i));
    }

    return uniqueChars.size() >= 3;
}
Run Code Online (Sandbox Code Playgroud)

(但是,您不需要创建变量。您可以在变量上inputStr调用 CharSequence 方法,例如charAt()和,因为实现了接口。)length()passwordStringCharSequence


编辑:我还想指出,您使用模式和匹配器的方式,您没有使用它们。您正确地从模式创建了匹配器,并将其与输入字符串相关联,但随后它就坐在那里。为了应用正则表达式,您必须调用其中一种方法,find()matches()(或lookingAt(),但没有人使用过该方法)。

这是初学者很常见的错误。无论如何,Java 都以过于冗长而闻名,但在本例中这一点尤其引人注目(并且令人惊讶)。我的意思是,如果正则表达式不是为了让您在不编写大量代码的情况下解决问题,那么它的用途是什么?但情况并不总是那么糟糕。这是使用正则表达式的单行解决方案:

return inputStr.replaceAll("(.)(?=.*\\1)", "").length() >= 3;
Run Code Online (Sandbox Code Playgroud)

即删除所有重复项,所得字符串的长度与唯一字符的数量相同。不过,基于集合的解决方案仍然更简单;这个只是更短一些。