0
package opop;

import java.util.Scanner;

public class Domashnoto {

    static public void main(String[] args){

        Scanner input = new Scanner(System.in);
        System.out.println("Text:");
        String s = input.next();

        s = s.toLowerCase();
        s = s.replaceAll("[^A-Za-z]+", "");
        s.replaceAll("\\s+", "");


        int j;
        int i;

        for (j = 0 ; j <= s.length() ; j++){
            int counter = 0;
             for (i = 0 ; i <= s.length(); i++){
                if(s.charAt(i) == s.charAt(j)){

                    counter++;
                }
            }
            System.out.println(s.charAt(i) + " " + "-" + " " + counter);
        }



    }

}

帮助!我只是不知道什么不好

4

2 回答 2

1

您对循环的两个<= s.length()测试应该是< s.length().

System.out.println(s.charAt(i)...应该是System.out.println(s.charAt(j)...,因为此时i循环已经完成。

此语句:s.replaceAll("\\s+", "");不执行任何操作,因为您没有将结果分配回s. 它会从字符串中删除空格,但这并不重要,因为上面的行已经删除了所有非字母字符。

如果您解决了前几件事,它将起作用。


但是,对于一种更简洁且避免重复报告相同字符的完全替代方法,您可以使用将字符映射到其频率的整数计数的映射,如下所示:

Map<Character,Integer> charMap = new HashMap<>();
for (char c : s.toCharArray()) {
    if (!charMap.containsKey(c)) {
        charMap.put(c, 1);
    } else {
        charMap.put(c, charMap.get(c) + 1);
    }
}

它迭代c字符串的每个字符 ( ),如果映射中不包含该字符,则分配一个频率1,或者如果它确实包含它,它会获取先前的频率,加 1,然后将其放回。

然后您可以迭代地图以显示频率:

for (char c : charMap.keySet()) {
    System.out.println(c + " - " + charMap.get(c));
}

HashMap中字符的顺序基本上是随机的。您可以将其更改为LinkedHashMap以保留每个字符的首次出现顺序,或将其更改为TreeMap以按字母顺序对其进行排序。

(PS 要使用这种方法,您还需要import java.util.*;或导入特定的类。)

于 2013-10-18T22:04:12.497 回答
1

最快的方法(仅有效,因为只能有 65536 个不同的字符:

public static void main(String[] args) {
    String s = "asdfasdfasasasasa";
    int[] counters = new int[65536];

    for (char c: s.toCharArray()) ++counters[c];
    for (int i = 0; i < counters.length; ++i) {
      if (counters[i] > 0) System.out.println((char)i + " - " + counters[i]);
    }
}
于 2013-10-18T22:14:04.083 回答