繁体   English   中英

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'); 不会给您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);
}

您可以使用地图。

我会好奇知道哪些语言这样的工作。我曾经使用过将字符值转换为使用是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 ),然后具有从charint某种映射功能。

但是,要从此练习中获取价值,您应该真正弄清楚为什么希望代码能起作用,以及对Java的理解意味着什么。 您是否期望数组充当任意键/值映射?

我不认为Java支持像PHP这样的数组索引。 只有数字,并且从零开始直到size-1。

因此,数组在这里不是一个好的解决方案。 如前所述,您必须使用地图 ,例如Hashmap

您为什么不将字母制成整数数组,其次我认为(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语言规范

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM