![](/img/trans.png)
[英]Is there a more efficient way to count the number of times each consecutive letter appears in a string? (java)
[英]Java: display number of times a letter appears in a string
这是来自Sun教程的练习区域,因此我想这是家庭作业。
我知道如何使用for循环来迭代字符串,但是我希望在使用数组的同时学习数组并将其存储在数组中。 这是我到目前为止所得到的:
BufferedReader in = new BufferedReader(new FileReader("xanadu.txt"));
int c;
char letters[] = new char[27]; //26 + newline?
while((c = in.read()) != -1){
letters[(char)c] += 1; //store in index, so letters['a'] = 4 etc..
}
现在由于某种原因(可以在其他语言中使用),它不能将int c
正确地转换为char
,并且它以十进制ascii形式输入letters[110]
或其他内容,当然这超出了我的数组范围。
我应该以什么方式解决该问题,这样才能获得不错的字符索引?
好吧,首先, System.out.println((int) 'A');
不会给您0
或1
,它会给您65,所以您至少应该做letters[(char) c - 'A'] += 1
。
不过,您仅考虑了27个字母,其中仅包括小写字母? 还是大写? 没有空间? 等等...
您可能想要做类似的事情
Map<Character, Integer> counts = new HashMap<Character, Integer>();
BufferedReader in = new BufferedReader(new FileReader("data.txt"));
int c;
while((c = in.read()) != -1) {
int count = counts.containsKey((char) c) ? counts.get((char) c) : 0;
counts.put((char) c, count + 1);
}
您可以使用地图。
我会好奇知道哪些语言这样做的工作。我曾经使用过将字符值转换为使用是Unicode,(如Java)或本地字符编码,通常是ASCII兼容整数每一种语言。 哪种语言会将“ a”转换为0或1?
无论如何,使代码在所有情况下都可以工作的最简单的更改是:
// char values in Java are in the range 0-65535.
int letters[] = new int[65536];
请注意,我已经将数组的类型从char
更改为int
,因为每个元素都应该是一个计数,而不是一个字符。
或者,您可以将其保留为大小为27的数组(尽管最好仍使用int
),然后具有从char
到int
某种映射功能。
但是,要从此练习中获取价值,您应该真正弄清楚为什么希望代码能起作用,以及对Java的理解意味着什么。 您是否期望数组充当任意键/值映射?
您为什么不将字母制成整数数组,其次我认为(letters [[char)c])将返回ASCII值,因此可能类似于
字母[c-97] + = 1可以解决问题
letters[(char)c] += 1; //store in index, so letters['a'] = 4 etc..
就如我所知,您希望您的字母数组像这样:letter ['a'] =(某些值)letter ['b'] =(某些值)
在Java中,只能用整数或其他数据类型(将它们提升为'int')来对数组建立索引。Java语言规范
您可以使用的最接近的是地图HashMap
或TreeMap
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.