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