我今天从大学接到了一项任务:
编写一个程序,从用户读取(短)文本并打印所谓的最大字母(字符串中最常见的字符),即给定文本出现次数最多的字母。 在这里查看英文字母(A-Z)就足够了,而不是在出现次数的计数中区分大写和小写字母。
例如,如果:text =“Ada bada”那么打印应该显示最常见的字符,这个例子就是a。
这是一个入门课程,所以在这个提交中我们不需要使用“scanner - 类”。我们没有经历过这么多。 该程序将使用show message输入两个来自用户的文本。
信息:程序不得使用while循环(true / false),“return”语句/“break”语句。
我一直在努力学习如何将char值添加到表中..我是否正确我需要使用数组来搜索最常见的字符?我想我需要使用binarySearch,但它只支持int而不是char。
我会很高兴得到任何答案。提示和解决方案。等等。如果你是一个非常善良的完整工作程序,但请再次请不要使用我在上面“信息”部分写下的内容。
我的代码:
String text = showInputDialog("Write a short text: ");
//format string to char
String a = text;
char c = a.charAt(4);
/*with this layout it collects number 4 character in the text and print out.
* I could as always go with many char c... but that wouldn't be a clean program * code.. I think I need to make it into a for-loop.. I have only worked with * *for-loops with numbers, not char (letters).. Help? :)
*/
out.print( text + "\n" + c)
//each letter into 1 char, into table
//search for most used letter
答案 0 :(得分:1)
这是常见的逻辑:
如何将字符串拆分为字符等,您可以使用Google。 :)
答案 1 :(得分:0)
有一个共同的程序被要求在学校写作来计算给定字符串中字母的频率。你要做的唯一事情是找到哪个字母的最大频率。这是一个说明它的代码:
String s <--- value entered by user
char max_alpha=' '; int max_freq=0, ct=0;
char c;
for(int i=0;i<s.length();i++){
c=s.charAt(i);
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
for(int j=0;j<s.length();j++){
if(s.charAt(j)==c)
ct++;
} //for j
}
if(ct>max_freq){
max_freq=ct;
max_alpha=c;
}
ct=0;
s=s.replace(c,'*');
}
System.out.println("Letter appearing maximum times is "+max_alpha);
System.out.println(max_alpha+" appears "+max_freq+" times");
注意:此程序假定字符串中的所有字符都是相同的大小写,即大写或小写。在获得输入后,您可以将字符串转换为特定的大小写。
答案 2 :(得分:0)
如果你不确定如何开始,我想这不是一个好的分配。我希望你有更好的老师!
所以你有一个文本,如:
String text = showInputDialog("Write a short text: ");
接下来的事情是有一个循环通过这个文本的每个字母,并得到它的每个字符:
for (int i=0;i<text.length();i++) {
char c=text.charAt(i);
}
然后是计算。最简单的方法是使用hashMap。我不确定这对于初学者课程是否是一个好主题,所以我想一个更适合初学者的解决方案会更合适。
创建一个整数数组 - 这是你所指的“表”。 数组中的每个项目将对应于一个字母的出现,例如,直方图[0]将计算“A”的数量,直方图[1]将计算您找到的“B”的数量。
int[] histogram = new int[26]; // assume English alphabet only
for (int i=0;i<histogram.length;i++) {
histogram[i]=0;
}
for (int i=0;i<text.length();i++) {
char c=Character.toUppercase(text.charAt(i));
if ((c>=65) && (c<=90)) {
// it is a letter, histogram[0] contains occurrences of "A", etc.
histogram[c-65]=histogram[c-65]+1;
}
}
然后终于找到了一个for循环的最大发生...
int candidate=0;
int max=0;
for (int i=0;i<histogram.length;i++) {
if (histogram[i]>max) {
// this has higher occurrence than our previous candidate
max=histogram[i];
candidate=i; // this is the index of char, i.e. 0 if A has the max occurrence
}
}
打印结果:
System.out.println(Character.toString((char)(candidate+65));
请注意,由于我们使用的是ASCII码,而且只有字母,所以这一切都是多么混乱......更不用说这个解决方案根本不适用于非英语文本。
如果您具有泛型和散列图的强大功能,并且知道更多字符串函数,那么这个混乱可以简化为:
String text = showInputDialog("Write a short text: ");
Map<Char,Integer> histogram=new HashMap<Char,Integer>();
for (int i=0;i<text.length();i++) {
char c=text.toUppercase().charAt(i));
if (histogram.containsKey(c)) {
// we know this letter, increment its occurrence
int occurrence=histogram.get(c);
histogram.put(c,occurrence+1);
}
else {
// we dunno this letter yet, it is the first occurrence
histogram.put(c,1);
}
}
char candidate=' ';
int max=0;
for (Char c:histogram.keySet()) {
if (histogram.get(c)>max) {
// this has higher occurrence than our previous candidate
max=histogram.get(c);
candidate=c; // this is the char itself
}
}
System.out.println(c);
小字体:我没有运行此代码,但它应该没问题。