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);
}
}
}
HELP!我只是不知道什么不好
答案 0 :(得分:1)
您对循环的两次<= s.length()
测试应为< s.length()
。
System.out.println(s.charAt(i)...
应为System.out.println(s.charAt(j)...
,因为此时i
循环已完成。
此声明:s.replaceAll("\\s+", "");
不执行任何操作,因为您未将结果分配回s
。它会从字符串中删除空格,但无论如何都没关系,因为上面的行已经删除了所有非字母字符。
如果你修复了前几件事,那就可以了。
但是,对于一个更加清晰且完全避免重复报告相同字符的完全替代方法,您可以使用map将字符映射到其频率的整数计数,如下所示:
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按字母顺序对其进行排序。
(P.S。要使用此方法,您还需要import java.util.*;
或导入特定的类。)
答案 1 :(得分: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]);
}
}