Java中不同重复字符的计数

Java中不同重复字符的计数,java,hashmap,duplicates,Java,Hashmap,Duplicates,我已经编写了代码来查找字符串输入中重复字符的数量。然而,在阅读了说明书之后,我意识到这并不是所要求的。是的,我需要计算重复的字符数,但不是那个特定字符的数量,我需要所有被复制字符的数量 我提供了一个输入和输出,以帮助更好地解释。我觉得我做得不好 输入: abcdea=>a重复=> 输出: 一, 输入: abcdeae=>a和e重复=> 输出: 二, 输入: abcdeaed=>a、d和e重复=> 输出: 三, 我已经把代码放在下面了。有人能帮我调整代码吗 public static int du

我已经编写了代码来查找字符串输入中重复字符的数量。然而,在阅读了说明书之后,我意识到这并不是所要求的。是的,我需要计算重复的字符数,但不是那个特定字符的数量,我需要所有被复制字符的数量

我提供了一个输入和输出,以帮助更好地解释。我觉得我做得不好

输入: abcdea=>a重复=> 输出: 一,

输入: abcdeae=>a和e重复=> 输出: 二,

输入: abcdeaed=>a、d和e重复=> 输出: 三,

我已经把代码放在下面了。有人能帮我调整代码吗

public static int duplicatesCount(String text) 
    {
        Map<Character,Integer> map = new HashMap<Character,Integer>();
        char[] carray = text.toCharArray();
        for (char c : carray)
        {
            if (map.containsKey(c))
            {
                map.put(c, map.get(c) +1);
            }
            else
            {
                map.put(c, 1);
            }
        }
        Set <Character> setChar = map.keySet();
        int returnC = 1;
        for (Character c : setChar)
        {
            if (map.get(c) > 1)
            {
                returnC = map.get(c);
            }
        }
        return returnC;

只要在hashmap中每次遇到值大于1的字符时计数

int returnC = 0;
for (Character c : setChar)
{
    if (map.get(c) > 1)
        returnC++;
}
或者,您也可以在这样创建hashmap时执行此操作

Map<Character,Integer> map = new HashMap<Character,Integer>();
char[] carray = text.toCharArray();
Set <Character> setChar = new Set<Character>(); //initialize the set up here
for (char c : carray)
{
    if (map.containsKey(c))
    {
        map.put(c, map.get(c) +1);
        setChar.add(c); //just add to set when a char already exists
    }
    else
    {
        map.put(c, 1);
    }
}

return setChar.size(); //then simply return the size of the set

在您的代码片段的末尾

int returnC = 0;
for (Character c : setChar)
    {
        if (map.get(c) > 1)
        {
            returnC ++;  //for each which has more than one instance
        }
    }
    return returnC;
可以使用字符串方法


更好的方法是对字符串进行排序,然后遍历它。如果前一个字符=当前字符,则增加重复数,并且在看到字符更改之前不再增加重复数

这不需要额外的存储,例如哈希映射


这也可以用来计算每个字母的重复数,只需做一点小小的改变:。

这里有另一种方法-不使用映射或排序算法

public static int duplicatesCount(String text) {
    int cnt = 0;
    while (text.length() > 1) {
        char firstLetter = text.charAt(0);
        if (text.lastIndexOf(firstLetter) > 0) {
            cnt++;
            text = text.replaceAll(("" + firstLetter), "");
        } else {
            text = text.substring(1, text.length());
        }
    }

    return cnt;
}
基本思想是逐个字符地检查字符串,如果text.lastIndexOffirstLetter>0,则检查字符串中是否存在该字符。如果存在,则增加cnt,然后删除字符串中出现的所有字符。
否则,只需删除第一个字符text=text.substring1,text.length

在当前代码中,您返回的是值,而不是计数

例如:

如果您的输入是abcdea,那么returnC将保存值2,该值是 重复按键a的次数

如果您的输入是abcdabeb,其中a重复两次,b重复 三次。您的输出将是3,因为returnC将保留键的值 b

您可以这样修改代码

 Set <Character> setChar = map.keySet();
 int returnC = 0;
 for (Character c : setChar) {
       if (map.get(c) > 1) { 
             returnC++;
       } 
 }
 return returnC;

此外,我们还可以使用String Buffer类创建另一个重复字符的字符串,然后我们可以显示它-

public static void main(String arghya[])
{
    String name="ARGHYA MUKHERJEE";
    StringBuffer duplicate=new StringBuffer();

    Set<Character> charlist=new HashSet<Character>();

    for(int i=0;i<name.length();i++) {
        Character c=name.charAt(i);
        if(charlist.contains(c))
        { 
            duplicate.append(c);
            //System.out.println(c+ " is repeatitive character in the string");
        }
        else {
            charlist.add(c);
        }
    }
    System.out.print("Duplicate characters which has appeared are as follows: "+duplicate);     
}

returnC当前对应于出现多次的最后一个字母的出现次数。不是每次都覆盖returnC,而是添加到它,但首先将其初始化为0,而不是1yep!粘贴感谢您的帮助时忘记更改:我最终根本没有使用哈希映射。当我运行IDE时,它导致IDE超时。再次感谢你:没问题。当我运行IDE时,它导致IDE超时。-也许你有一个不定式循环。再次检查代码。如果您发现其中一些答案对您的解决方案有用,您应该投票赞成或/并接受该解决方案。我确实投票赞成您的解决方案,但因为我的声誉低于15岁,一个弹出窗口说我的投票不会显示。我不知道如何选择一个解决方案。我的意思不仅仅是在我的答案中,而是一般来说:任何对你有帮助的答案。而且,如果你接受这个解决方案,你的声誉也会提高。
public static void main(String arghya[])
{
    String name="ARGHYA MUKHERJEE";
    StringBuffer duplicate=new StringBuffer();

    Set<Character> charlist=new HashSet<Character>();

    for(int i=0;i<name.length();i++) {
        Character c=name.charAt(i);
        if(charlist.contains(c))
        { 
            duplicate.append(c);
            //System.out.println(c+ " is repeatitive character in the string");
        }
        else {
            charlist.add(c);
        }
    }
    System.out.print("Duplicate characters which has appeared are as follows: "+duplicate);     
}