计数字母频率和打印字母:计数,但不是重复的java字符串

时间:2016-09-22 02:03:58

标签: java string frequency counting

public static void main(String[] args) {
    TextIO.putln("Text?");
    String line = TextIO.getln();
    line = line.toLowerCase();
    char[] arr = line.toCharArray();
    for(int i = 0; i < line.length(); i++){
        if(Character.isLetter(arr[i])){
            int count;
            int j;
            for(j = 0,count = 0; j < line.length(); j++){;
                if( arr[i] == arr[j]){
                    count++;
                }
            }
            System.out.printf("%c:%d\n", arr[i],count);
        }

    }
}

如果我输入字符串josh,它会打印出来 记者:1 ○:1 S:1 H:1 如果我输入joshh它打印 记者:1 ○:1 S:1 H:2 H:2 但我想要 记者:1 ○:1 S:1 H:2

对于任何带有重复字符串的字符串,我如何仅打印出唯一的字母以及它出现的次数?我想的可能是实现一个for循环,只检查每个字母并增加它,如 for('a':string)     总++ 然后将'a'递增1,所以下一个循环将检查b的出现次数,然后是c,依此类推。

4 个答案:

答案 0 :(得分:0)

你知道多少java?这是一项任务吗?你经历过数据结构吗?两个选项:

  • 排序然后计算
  • 使用地图(如果您来自Python的字典,如您的用户名所示),在第一遍中递增,然后迭代键以打印值

答案 1 :(得分:0)

试试这个。

Map<Character, Integer> map = new LinkedHashMap<>();
for (char c : line.toCharArray())
    if (Character.isLetter(c))
        map.compute(c, (k, v) -> v == null ? 1 : v + 1);
for (Entry<Character, Integer> e : map.entrySet())
    System.out.printf("%c:%d\n", e.getKey(), e.getValue());

答案 2 :(得分:0)

public static void main(String[] args) {
    TextIO.putln("Text?");
    String line = TextIO.getln();
    line = line.toLowerCase();
    // char[] arr = line.toCharArray();
    Map<Character, Integer> occurrences=new LinkedHashMap<Character, Integer>();
    for(int i = 0; i < line.length(); i++){
        int ch=line.charAt(i);
        if(Character.isLetter(ch)){
            if(occurrences.containsKey(ch)) {
              occurrences.put(ch, occurrences.get(ch)+1); // increment
            }
            else {
              occurrences.put(ch, 1);
            }
        }
    }
    for(char ch : occurrences.keySet()) {
      System.out.print(ch+":"+occurrences.get(ch)+";");
    }
    System.out.println();
}

答案 3 :(得分:0)

据我所知,看起来问题在于您在打印时使用的for循环。

您要评估字符串中的每个字符并进行打印。一旦你评估josh中的第一个h,你的程序就会转到第二个h,再次进行评估,结果再次打印h及其计数。

您可以尝试一种数据结构,例如考虑唯一元素的字典。或者,当您计算出字母出现的次数时,您可以使用另一个包含已经看过的字母的数组。如果在计算一个字母出现的次数之前检查此数组,您可以查看该字母是否已被计数,如果是,您可以跳过此字符并继续下一个字符。它不是最优雅的解决方案,但它可以工作