Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-如何检查字符串中的重复字符?_Java_Regex_String_Function_Duplicates - Fatal编程技术网

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

Java-如何检查字符串中的重复字符?,java,regex,string,function,duplicates,Java,Regex,String,Function,Duplicates,我需要编写一个函数来检查字符串中的重复值,并返回唯一字符的计数。如果计数大于3,则应返回true。如果计数小于3,则应为false。以下是我一直在尝试的内容(请注意,我是java新手) private boolean isFormatValid(字符串密码){ CharSequence inputStr=密码; int length=inputStr.length(); int numberDups=0; 对于(int i=0;i.private boolean isFormatValid(字符

我需要编写一个函数来检查字符串中的重复值,并返回唯一字符的计数。如果计数大于3,则应返回true。如果计数小于3,则应为false。以下是我一直在尝试的内容(请注意,我是java新手)

private boolean isFormatValid(字符串密码){
CharSequence inputStr=密码;
int length=inputStr.length();
int numberDups=0;
对于(int i=0;i
我试图使用正则表达式,因为有人建议它可能更容易。但是如果没有正则表达式我也能做到这一点,我会更高兴

这是什么意思

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);   
    }
}
private boolean isFormatValid(字符串密码){
int length=inputStr.length();
int numbercars=0;
对于(int i=0;i

我觉得这一点还不够正确……

你已经差不多做到了。不使用正则表达式,您可以使用索引:
i
索引到
字符串中
,并使用
charAt(int)
读取特定字符


然后需要一个数据结构来跟踪每个字符出现的次数。我建议使用
HashMap
进行此操作,其中map键是您已阅读的
字符,map值是发生次数的
整数。

算法非常简单:

  • 将字符串拆分为字符数组
  • 将所有这些字符添加到集合(HashSet)

  • 之后,您的集合只包含唯一字符。

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

    在这种情况下,正如其他人所说,最简单的解决方案是使用集合。事实上,你的代码就在那里;只需去掉
    numberDups
    计数器,并用
    HashSet
    替换它,如下所示:

    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;
    }
    

    也就是说,删除所有重复项,结果字符串的长度与唯一字符的数量相同。不过,基于集合的解决方案更简单;这只稍微短一点

    我将简单地循环使用字符串indexOf函数,并按照您的方式进行操作。如果您想使用正则表达式,您可以编写一个只需对字符串使用一次的正则表达式。这个问题要求输入唯一字符的数量,但代码似乎在尝试计数重复项。。。。我只是看错了吗?——谢天谢地,这不是家庭作业。我是一个初学者,试图通过一些书籍和论坛自学JAVA。我试图使用检查字符串长度的方法,并将其与重复的数量进行比较,不同的是唯一字符的数量。但现在它已经下降了,这似乎太复杂了。不过,这无助于统计事件的发生。仅检测是否存在重复字符。如果我错了,请告诉我,问题是“检查字符串是否存在重复值并返回唯一字符计数的函数”。我现在正在研究这个建议。这正是我想要做的。@mishadoff你说得对。。。我太专注于代码了。他确实问了一些独特的字符+如果是那样的话。这正是我要建议的。你能举例说明你的意思吗。这种方法听起来像是我想要的。@Rich他很清楚。你在这里不明白什么,所以你想举个例子吗?@Rich:如果你先尝试编写代码,然后发布一个新问题或更新这个问题,描述你遇到的任何问题,可能会更好(为了你的理解)。HashMap的诀窍在于,如果给定字符没有映射,则添加一个条目:->1。但是,如果已经存在映射,则添加一个条目:->.private boolean isFormatValid(字符串密码){int length=inputStr.length();int numbercars=0;for(int i=0;istatic 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; }
    return inputStr.replaceAll("(.)(?=.*\\1)", "").length() >= 3;