Java:显示字母在字符串中出现的次数

时间:2010-09-30 06:19:05

标签: java arrays input

这是来自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,当然这是超出我阵列的范围。

我应该以什么方式解决这个问题,这样我就能得到一个很好的字符索引?

6 个答案:

答案 0 :(得分:3)

首先,System.out.println((int) 'A');不会给你01,它会给你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)

我认为Java不支持那种数组索引(就像PHP那样)。只有数字,只有从零开始,直到大小为1。

所以数组在这里不是一个好的解决方案。正如foret建议您必须使用Map,例如Hashmap

答案 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

您可以使用的最近地图是地图 - HashMapTreeMap