Java

时间:2018-01-17 16:40:31

标签: java hashmap duplicates

我编写了代码来查找字符串输入中的重复字符数量。但是在阅读完规范之后,我意识到这不是所要求的。是的,我需要计算重复的字符数,但不需要计算特定字符的数量,我需要重复所有字符的数量。

我已经给出了输入和输出以帮助解释更好。我不认为我做得很好。

输入: “abcdea”=> “a”重复=> 输出: 1

输入: “abcdeae”=> “a”和“e”重复=> 输出: 2

输入: “abcdeaed”=> “a”,“d”和“e”重复=> 输出: 3

我把我的代码放在下面。有人可以帮忙调整我的代码吗?

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;

7 个答案:

答案 0 :(得分:2)

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

这不需要额外的存储空间(例如哈希映射)。

这也可用于计算每个字母的重复数量,但稍作修改:)。

答案 1 :(得分:1)

每次遇到哈希映射中值大于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

答案 2 :(得分:1)

在你的片段结束时......

int returnC = 0;
for (Character c : setChar)
    {
        if (map.get(c) > 1)
        {
            returnC ++;  //for each which has more than one instance
        }
    }
    return returnC;

答案 3 :(得分:0)

您可以使用String方法

int count = 0;
String s = "abcdeabc";
while(s.length() > 0) {
    String c = s.substring(0, 1);
    if(s.lastIndexOf(c) != 0) {
        count++;
    }
    s = s.replaceAll(c, "");
}

答案 4 :(得分:0)

这是另一种方法 - 不使用key或排序算法。

Map

基本思想是遍历字符串char-by-char并检查字符是否存在于字符串中的某个位置(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; } )。如果它存在增量if (text.lastIndexOf(firstLetter) > 0),则删除字符串中出现的所有字符 否则,只需删除第一个字符(cnt

答案 5 :(得分:0)

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

例如:

  1. 如果你的输入是“abcdea”,那么returnC保持值2即为 密钥a重复的次数。

  2. 如果你的输入是“abcdabeb”,其中a重复两次,b重复 三次。您的输出将为3,因为returnC将保持密钥的值 湾

  3. 您可以像这样修改代码。

    $Service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2013_SP1);
    

答案 6 :(得分:0)

我们还可以使用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);     
}