好吧,我认为自己了解基础知识和一些高级Java,但仍然没有勇气开始编写我的想法。这是一个简单的程序,我提出了基本上输出你的文字具有的特定字母的数量(我想我说错了...)这是我的代码:
public class gene {
public static void main(String[] args) {
String[] phrases = {"hello", "egg", "learning", "ferrero", "rocher",
"Horologe", "Twinling"};
int a=0;
int b=0;
int c=0;
int d=0;
int e=0;
int f=0;
int g=0;
int h=0;
int i=0;
int j=0;
int k=0;
int l=0;
int m=0;
int n=0;
int o=0;
int p=0;
int q=0;
int r=0;
int s=0;
int t=0;
int u=0;
int v=0;
int w=0;
int x=0;
int y=0;
int z=0;
for(int ii =0; ii <phrases.length; ii++){
char[] charphrases = phrases[ii].toCharArray();
for(int iii = 0; iii<charphrases.length; iii++){
switch(charphrases[iii]){
case ('a'):
a++;
break;
case ('b'):
b++;
break;
case ('c'):
c++;
break;
case ('d'):
d++;
break;
case ('e'):
e++;
break;
case ('f'):
f++;
break;
case ('g'):
g++;
break;
case ('h'):
h++;
break;
case ('i'):
i++;
break;
case ('j'):
j++;
break;
case ('k'):
k++;
break;
case ('l'):
l++;
break;
case ('m'):
m++;
break;
case ('n'):
n++;
break;
case ('o'):
o++;
break;
case ('p'):
p++;
break;
case ('q'):
q++;
break;
case ('r'):
r++;
break;
case ('s'):
s++;
break;
case ('t'):
t++;
break;
case ('u'):
u++;
break;
case ('v'):
v++;
break;
case ('w'):
w++;
break;
case ('x'):
x++;
break;
case ('y'):
y++;
break;
case ('z'):
z++;
break;
}
}
}
System.out.println("A:" + a + "\n" + "B:" + b + "\n" +"C:" + c + "\n" +"D:" + d + "\n" +"E:" + e + "\n" +"F:" + f + "\n" +"G:" + g + "\n" +"H:" + h + "\n" +"I:" + i+ "\n" +"J:" + j + "\n" +"K:" + k + "\n" +"L:" + l + "\n" +"M:" + m + "\n" +"N:" + n + "\n" +"O:" + o + "\n" +"P:" + p + "\n" +"Q:" + q + "\n" +"R:" + r+ "\n" +"S:" + s + "\n" +"T:" + t + "\n" +"U:" + u + "\n" +"V:" + v + "\n" +"W:" + w + "\n" +"X:" + x + "\n" +"Y:" + y + "\n" +"Z:" + z + "\n" + z);
}
}
正如您所看到的,对于这样一个简单的程序来说它非常长,毫无疑问,有一种更短的编写方式。有人可以告诉我在哪里可以缩小程序,使其更短,更有效。
答案 0 :(得分:6)
怎么样
int[] count = new int[26];
你可以做到
for(char c: string.toCharArray())
count[c - 'a']++;
答案 1 :(得分:2)
不是声明26个不同的int
变量,而是声明一个长度为26的int
数组。此处的所有元素都会自动初始化为0.
int[] letterCounts = new int[26];
然后,不是26个案例,而是利用字母的数值全部按数字顺序排列的事实。如果从字母中减去'a'
,则会得到0到25之间的值,表示您需要的索引。然后你可以说:
letterCounts[charphrases[iii] - 'a']++;
根据您的要求,您可能需要单独处理其他字符,例如大写字母,数字和/或标点符号。
然后你可以遍历你的数组内容,添加'a'
来重现这个字母,然后打印相应的数组元素。
答案 2 :(得分:1)
您可以拥有26个成员的数组而不是26个变量。我们知道0-25中的每个索引代表什么(0是'A',1是'B',2是'C'等等......然后为了增加那个字母,可以通过转换char来找到它的索引转换为整数。(转换将要求您手头有一个ASCII参考,任何都可以。)只要您了解必要的偏移,学习在字符和整数之间进行转换是相对简单的。
答案 3 :(得分:1)
您可能需要考虑使用Map
。 Map
允许您将一个数据与另一个数据相关联,因此如果您可以执行类似的操作:
Map<Character, Integer> characterCount = new LinkedHashMap<>();
Integer currentCount = characterCount.get('a');
if(currentCount == null) {
currentCount = 0;
}
characterCount.put('a', currentCount++);
这比其他人建议的那样使用数组有点啰嗦,但如果你不想再在以后的某个地方使用char
,它会更加灵活。
答案 4 :(得分:0)
我使用Map
为您制作了一个程序。看看:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
System.out.println(map);
String alphabet = "abcdefghijklmnopqrstuvwxyz";
for(char c : alphabet.toCharArray())
map.put(c, 0);
addString("Hello World", map);
System.out.println(map);
}
public static void addString(String s, Map<Character, Integer> m){
s = s.toLowerCase().replace(" ", "");
for(char c : s.toCharArray())
m.put(c, m.get(c) + 1);
}
}
答案 5 :(得分:0)
我已经改进了mjkaufers的答案,这就是你可以做些什么来计算任何字符(包括UTF-8和特殊字符):
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) {
Map<Character, Integer> map = new HashMap<Character, Integer>();
countCharacters("Hello World", map);
System.out.println(map);
}
public static void countCharacters(String s, Map<Character, Integer> m) {
s = s.replace(" ", ""); // do not count spaces
// if you only want to count lower case characters:
// s = s.toLowerCase();
for (char c : s.toCharArray()) {
int cnt = (m.get(c) == null) ? 0 : m.get(c);
m.put(c, cnt + 1);
}
}
}