所以我们的老师给了我们这个功课,我们不得不写一个类似于
的程序编写一个从键盘读取一行文本的应用程序,并打印一个表格,指出每个字母的出现次数 文本中的字母表,例如,短语
成为或不成为:这是一个问题:
包含一个“a”,两个“b”,“no”,“等等”。
我已经编写了代码,但是当我输入要成为或不成为代码时,我遇到了一个小问题。我永远看了这个程序,我甚至试过问雅虎的一些人(但我觉得我很困惑)。所以我希望有人在这里找到我错过的东西,或者给我一些建议。
public class occurances {
public static void main(String[] args) {
Scanner inp = new Scanner(System.in);
String str;
char ch;
int count = 0;
System.out.println("Enter the string:");
str = inp.nextLine();
while (str.length() > 0) {
ch = str.charAt(0);
int i = 0;
while (i < str.length() && str.charAt(i) == ch) {
count = count++;
i++;
}
str = str.substring(count);
System.out.println(ch);
System.out.println(count);
}
}
}
答案 0 :(得分:3)
您的代码存在许多问题,但请从count = count++
开始。它将始终具有其初始值(在您的情况下为0)。这导致无限循环。如果您管理这个,那么您可以进一步调试代码。了解如何使用调试器和/或打印来检查代码。祝你好运。
答案 1 :(得分:2)
看来你的方法不一定是老师想要的方法。您的方法(如果它完全有效)将按字符在字符串中出现的顺序显示字符计数。因此,例如,对于“要成为或不成为:这是问题”,您将首先显示“T”的字符数,而教师可能希望您首先显示“a”的字符数。您的方法也不会显示答案中缺少的字符的字符数。
在其他两个答案中建议使用Map。我推荐这种方法,尽管你可以使用一个简单的int[]
数组,其索引是(ch - 'a'
),假设它在0
和25
之间。请参阅Character.toLowerCase()
了解如何将字符转换为小写字符,因为正确的答案可能会将“T”和“t”视为相同。
数组中只需要一个循环,递增显示的字符的计数。显然,所有计数应该在循环之前初始化为0
。
答案 2 :(得分:0)
您的代码中需要解决的一些问题:
while(str.length()>0)
:这里有无限循环。您可以使用for (int index = 0; index < str.length(); index++)
。ch = str.charAt(0);
:在这里你总是拿着字符串的第一个字母,你应该用ch = str.charAt(index);
取每个字母。count = count++;
:count++;
就足够了count = count + 1;
。count = count++;
:应该在内部循环之前为每个字母count = 0;
重新初始化计数。str = str.substring(count);
:这里不需要子串。你会松开字母进行下一次计算。您的代码应该适用于一种不满。这些字母和它们的数量将被记录为它们的出现次数。如果a
在字符串中是3次,则a : 3
将被写入3次。
所以你应该是否已经打印过这封信(也许是一个数组),但性能会很差。对于n个字母的字符串,您将有n * n个计算(Complexity O(n ^ 2))。如果你在字母和它们的计数之间取一个HashMap,你只需要遍历字符串一次,在迭代循环时递增你的计数器。那你就只有n次计算。 (复杂性O(n))。
HashMap<Char, Integer> letters = new HashMap<Char, Integer>();
for (int i = 0; i < str.length(); i++) {
char letter = str.charAt(i);
if (!letters.contains(letter)) {
letters.put(letter, 1);
} else {
letters.put(letter, letters.get(letter) + 1);
}
}
然后,您将浏览地图以显示计数。
答案 3 :(得分:0)
我有一段时间没有做JAVA我来这里帮助Javascript的人...但我会放弃它
while(str.length()>0)
这显然会进入一个无限循环,因为你没有突破性的条款...我可能会使用for循环...你也需要一些东西来存储你找到的每个独特字母的计数。
- 根据下面的评论进行编辑,我发现自己同意回答你的作业不是一件好事,但这是我建议你看的......
这可以让你走上正确的道路:http://www.java2s.com/Tutorial/Java/0140__Collections/GettingelementskeyvaluepairsfromaHashtabletheentrySetmethod.htm
答案 4 :(得分:0)
以下是您提出的问题的更正代码。试试这个..
import java.util.*;
public class Occurence {
public static void main(String[] args) {
Scanner inp = new Scanner(System.in);
String str;
char ch;
int count = 0;
System.out.println("Enter the string:");
str = inp.nextLine();
int length = str.length();
int i = 0, j = 0;
for (i = 0; i < length; i++) {
j = 0;
count=0;
for (j = 0; j < length; j++) {
if (str.charAt(j) == str.charAt(i)) {
count++;
}
System.out.println(str.charAt(i)+" "+count);
}
}
}
}