1

我有以下程序可以计算字符串中字符的出现次数。例如,给定一个字符串 - my name is stack overflow,我希望输出为

f 1 e 2 c 1 a 2 n 1 o 2 l 1 m 2 k 1 i 1 w 1 v 1 t 1 s 2 r 1 y 1

但是,似乎出了点问题,我无法弄清楚是什么。另外,请注意 - 我确实看到了过去发布的一些程序。可能重复。但我想帮助解决我的具体问题,而不是使用其他人的解决方案。

这是代码:

//Count the occurence of a character in a string
package strings;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class CharacterOccurenceInAString {
    private static Map<Integer, Character> str = new HashMap<Integer, Character>();
    private static List<Character> charList = new ArrayList<Character>();
    private static Character value;

    public static void main(String[] args) {
        BufferedReader br = null;
        String input = "";
        try {
            br = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("Please enter a string");
            input = br.readLine();
            charOccurence(input);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
    public static void charOccurence(String s) {        
        for (int i = 0; i < s.length(); i++) {
            // Don't include white spaces -         
            if (Character.isWhitespace(s.charAt(i))) {
                continue;
            } else {
                str.put(i, s.charAt(i));
                charList.add(s.charAt(i));
            }
        }
        for(Character val:str.values()){
                getCount(val);
        }
    }

    static boolean flag = false;
    public static int getCount(Character c) {
        int ct = 0;
        for (int i = 0; i < charList.size(); i++) {         
            c = charList.get(i);
            if (charList.contains(c)) {
                ct++;
                flag=false;
            }           
        }
        if(flag==false)
        {
        System.out.println(c + ":" + ct);
        }
        return ct;
    }
}

这是我得到的输出:

Please enter a string
my name is stack overflow
w:21
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21 
w:21
4

4 回答 4

1

番石榴中:

Multiset<Character> occurrences = HashMultiset.create(
    Lists.charactersOf(CharMatcher.WHITESPACE.removeFrom("the string")));
于 2013-05-02T21:07:23.497 回答
0

如果要获取字符数,最好使用 Map< Character, Integer> 而不是 Map< Integer,Character>。

Map<Character, Integer> charCount = new HashMap<Character,Integer>();
for (int i = 0; i < s.length(); i++) {
    Integer count = charCount.get(s.charAt(i));
    if (count == null)
        count = 0;
    charCount.put(s.charAt(i), ++count);
}

这将为您提供所有字符的地图,以了解它们出现的次数。

于 2013-05-02T21:06:12.507 回答
0

为了使这项工作对您的代码进行最少的更改:

public static int getCount(Character c) {
    int ct = 0;
    for (int i = 0; i < charList.size(); i++) {         
        //c = charList.get(i); //why were you doing this, this method takes the desired c as an input?
        if (charList.get(i).equals(c)) { //now it only incriments when that particular entry equals c, not if ANY entry matches c
            ct++;
            flag=false;
        }           
    }
    if(flag==false)
    {
    System.out.println(c + ":" + ct);
    }
    return ct;
}

在您的 getCount 版本中,如果字母在字符串中的任何位置,您会遍历整个字符串,每次循环都会在循环中添加一个,您还可以在 getCount 中更改 c,我认为您不应该这样做。

此更改不会使您的代码完美,重复的字母会导致重复(但正确)的输出,但它应该为您指明正确的方向

于 2013-05-02T21:08:15.567 回答
-2

我建议不要问专家,而是先尝试通过在 Eclipse 中以步进模式调试代码来自己找出错误。您可以单步执行每个语句,并在单步执行时查看变量的值。这很有趣而且内容丰富:)

于 2013-05-02T21:10:21.403 回答