这是来自Sun的教程的练习区,所以我想这是家庭作业。
我知道如何使用for循环来迭代字符串,但我希望同时学习数组并将其存储在so中。这就是我到目前为止得到的:
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,而是进入letters[110]或其他十进制ascii,当然这超出了我的数组的界限。
我应该用什么方法解决这个问题,这样我才能有一个很好的字符索引?
发布于 2010-09-30 14:23:42
首先,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);
}发布于 2010-09-30 14:22:15
您可以使用Map。
发布于 2010-09-30 14:26:37
我很想知道它在哪种语言中工作。我使用过的每种语言都会使用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的理解意味着什么。您希望数组充当任意的键/值映射吗?
https://stackoverflow.com/questions/3828247
复制相似问题