Java 树形图——如何找到以字母表中每个字母开头的单词数
所以我有一个单词列表。例如,{Apple,Available,Art,Between,Beyond,Door,Drive,…} 我想显示字母表中每个字母开头的单词数,所以结果应该是A=3,B=2,D=2 这是我写的代码,但显然它没有按照我想要的方式工作Java 树形图——如何找到以字母表中每个字母开头的单词数,java,list,loops,dictionary,treemap,Java,List,Loops,Dictionary,Treemap,所以我有一个单词列表。例如,{Apple,Available,Art,Between,Beyond,Door,Drive,…} 我想显示字母表中每个字母开头的单词数,所以结果应该是A=3,B=2,D=2 这是我写的代码,但显然它没有按照我想要的方式工作 Map<String, Integer> myMap = new TreeMap<String, Integer>(); for (int i = 0; i < theWords.length; i
Map<String, Integer> myMap = new TreeMap<String, Integer>();
for (int i = 0; i < theWords.length; i++) {
for (char alphabet = 'A'; alphabet <= 'Z'; alphabet++) {
int numOfWords = 0;
char firstLetter = theWords[i].charAt(0);
if (firstLetter == alphabet) {
myMap.put(String.valueOf(alphabet), numOfWords + 1);
}
}
}
System.out.println(myMap);
另外,我必须使用TreeMap。您设置
int numofords=0内部循环中的代码>就是这样。
这就是为什么它总是1
放在地图中而不是双循环,您可以获取第一个字符并添加到地图中
类似于:
for (String fruit : theFruits) {
String firstLetter = fruit.substring(0, 1);
Integer count = myMap.get(firstLetter);
if (count == null) {
myMap.put(firstLetter, 1);
}
else {
myMap.put(firstLetter, ++count);
}
}
映射使用值映射键,其中键是唯一的
创建一张地图
对于列表中的每个单词,获取第一个字符
查看获取的字符是否存在于映射的键集中
如果存在,则只需增加该键的计数,否则在地图中创建一个新条目,并将计数保持为1李>
对于您的问题,只需获取大小为26的int
类型的数组。这将作为您的地图
第0个索引用于a
,第1个索引用于b
,依此类推,直到第25个索引用于z
现在应用上述逻辑
例如,如果单词列表是
String[] wordList = { "apple", "mango", "berry", "rice", "banana"} ;
int [] map = new int [26]; //by default all elements initialized with 0
for(int i =0; i < wordList.length; i++){
char first = wordList[i].charAt(0);
int index = first - 'a';
map[index] = map[index] + 1;
}
String[]wordList={“苹果”、“芒果”、“浆果”、“大米”、“香蕉”};
int[]map=新int[26]//默认情况下,所有元素都用0初始化
for(int i=0;i
假设:单词大小写,每个单词仅由26个英文字母组成,所有单词都是唯一的。在额外字符的情况下,需要修改数组的大小,对于重复的字符,可以用Hashmap替换数组,但算法步骤与上面提到的相同
注意:通常对于前缀搜索,Trie是首选解决方案。每次迭代内部for循环时,都将numofords设置为0。在您的内部if语句中,它永远不会超过0+1。对于每个语句都使用,这样更容易阅读您的代码for(stringword:theWords){}
Map将键映射为值,其中键是唯一的。1.创建一张地图,2。对于列表中的每个单词,获取第一个字符3。查看映射4的键集中是否存在提取的字符。如果存在,则只需增加该键的计数,否则在地图中创建一个新条目,并将计数保持为1。对于您的问题,只需获取大小为26的int
类型的数组。这将成为你的地图。第0个索引用于A
,第1个索引用于B
,依此类推,直到第25个索引用于Z
。现在应用上述逻辑虽然这可能是真的,但我认为OP正在努力学习基本的编码概念,并且犯了一个逻辑错误。我不知道改进他们的技术在这里有什么帮助,因为他们真的需要理解他们的错误。@leigero,我理解你的意思。然而,我认为双重循环混淆了这个问题。目标是获取单词的第一个字母,并在映射中增加一个计数器。额外的循环模糊了逻辑。因此,减少混乱会使方法更容易理解,IMHO@HT0000,很高兴它有所帮助。你不妨考虑一下。
String[] wordList = { "apple", "mango", "berry", "rice", "banana"} ;
int [] map = new int [26]; //by default all elements initialized with 0
for(int i =0; i < wordList.length; i++){
char first = wordList[i].charAt(0);
int index = first - 'a';
map[index] = map[index] + 1;
}