这是来自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
,而是输入letters[110]
或者十进制的ascii,当然这是超出我阵列的范围。
我应该以什么方式解决这个问题,这样我就能得到一个很好的字符索引?
答案 0 :(得分:3)
首先,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);
}
答案 1 :(得分:2)
你可以使用Map。
答案 2 :(得分:2)
我很想知道这个使用哪种语言。我曾经使用的每种语言都会使用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
到{{具有某种映射函数1}}。
但是,要从本练习中获得价值,您应该确定您希望代码工作的原因,以及这对您对Java的理解意味着什么。您是否期望数组充当任意键/值映射?
答案 3 :(得分:1)
答案 4 :(得分:1)
为什么不把字母作为整数数组来表示 其次 我认为(letters [(char)c])会返回ASCII值,所以可能是
字母[c-97] + = 1可以解决问题
答案 5 :(得分:1)
letters[(char)c] += 1; //store in index, so letters['a'] = 4 etc..
当我得到它时,你希望你的字母数组是这样的 字母['a'] =(某个值) 字母['b'] =(某个值)
在Java中,数组只能由整数或其他数据类型索引(它们将被提升为'int')Java Language Spec
您可以使用的最近地图是地图 - HashMap
或TreeMap