Java 树形图——如何找到以字母表中每个字母开头的单词数

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

所以我有一个单词列表。例如,{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++) {
        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;
    }