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,依此类推。
答案 0 :(得分:0)
你知道多少java?这是一项任务吗?你经历过数据结构吗?两个选项:
答案 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及其计数。
您可以尝试一种数据结构,例如考虑唯一元素的字典。或者,当您计算出字母出现的次数时,您可以使用另一个包含已经看过的字母的数组。如果在计算一个字母出现的次数之前检查此数组,您可以查看该字母是否已被计数,如果是,您可以跳过此字符并继续下一个字符。它不是最优雅的解决方案,但它可以工作