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

Java:显示字母在字符串中出现的次数,java,arrays,input,Java,Arrays,Input,这是来自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[(ch

这是来自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
,而是输入
字母[110]
或十进制ascii,当然这超出了我的数组范围


我应该用什么方法来解决这个问题,这样我才能有一个很好的字符索引?

你可以使用Map。

你可以使用Map。

首先,
System.out.println((int)'a')
不会给你
0
1
,它会给你65,所以你至少应该做
字母[(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);
}
Map counts=newhashmap();
BufferedReader in=新的BufferedReader(新文件读取器(“data.txt”);
INTC;
而((c=in.read())!=-1){
int count=counts.containsKey((char)c)?counts.get((char)c):0;
counts.put((字符)c,count+1);
}

首先,
System.out.println((int)“A”)
不会给你
0
1
,它会给你65,所以你至少应该做
字母[(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);
}
Map counts=newhashmap();
BufferedReader in=新的BufferedReader(新文件读取器(“data.txt”);
INTC;
而((c=in.read())!=-1){
int count=counts.containsKey((char)c)?counts.get((char)c):0;
counts.put((字符)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意味着什么。您是否希望数组充当任意键/值映射?

我很想知道这在哪些语言中有效。我使用过的每种语言都会使用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意味着什么。您希望数组充当任意键/值映射吗?

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


因此,数组在这里不是一个好的解决方案。正如foret所建议的,您必须使用a,比如。

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


因此,数组在这里不是一个好的解决方案。正如foret建议的那样,你必须使用a,比如a。

为什么不将字母作为整数和 其次 我认为(字母[(char)c])将返回ASCII值,因此可能类似于


字母[c-97]+=1就可以了,你为什么不把字母做成整数和整数的数组呢 其次 我认为(字母[(char)c])将返回ASCII值,因此可能类似于

字母[c-97]+=1就可以了

字母[(char)c]+=1//存储在索引中,因此字母['a']=4等..

我明白了,你希望你的字母数组是这样的 字母['a']=(某些值) 字母['b']=(某些值)

在Java中,数组只能通过整数或其他数据类型进行索引(它们将被提升为“int”)

您可以使用的最接近的映射是Maps-
HashMap
TreeMap
字母[(char)c]+=1//存储在索引中,因此字母['a']=4等..

我明白了,你希望你的字母数组是这样的 字母['a']=(某些值) 字母['b']=(某些值)

在Java中,数组只能通过整数或其他数据类型进行索引(它们将被提升为“int”)


您可以使用的最近的地图是Maps-
HashMap
TreeMap

嗯?我的意思是我希望数组[(char)65]变成数组['A'],我没有得到你的评论。在java中不能将数组索引存储为字母吗?它总是默认为ascii吗?Java中的数组不像PHP中的关联数组。也许你要找的是一张地图。@John:
array[(char)65]
array['a']
实际上是一样的,它们将访问数组索引65。数组是固定的