【问题标题】:How to count the number of names in a queue that begin with the same first letter?如何计算队列中以相同首字母开头的名称数量?
【发布时间】:2016-03-29 20:53:25
【问题描述】:

我对如何计算队列中以相同第一个字符开头的名称的数量感兴趣。

我的程序将要求用户输入几个名称,这些名称将存储在一个队列中。但是,我需要计算队列中以相同第一个字符开头的名称的数量。我怎么做?我是java新手,所以不太了解。

它应该打印以下统计信息:
- 队列中以相同字母开头的国家/地区名称总数。
- 要计算上述统计数据,您可以使用其他数据结构,例如 Array 或 ArrayList/Vector。

例子:

用户输入/队列中的内容:

  1. 鲍勃
  2. 伊莎贝拉
  3. 肖恩
  4. 苏西
  5. 莎莉
  6. 艾达

输出:

以I开头的国家总数:2个

以S开头的国家总数:3个

我已经尝试过搜索,但我还没有真正找到一个可靠的方法来做到这一点。任何帮助将不胜感激。

【问题讨论】:

  • 你是如何存储名字的?在列表还是数组中?
  • 你制定了一个算法来解决这个问题吗?如果你可以一步一步地描述一个人应该如何做(即不是计算机程序),那是一个很好的起点。
  • 除了map方法还有其他方法吗?

标签: java arrays arraylist stack queue


【解决方案1】:

尝试类似:

Map<Character, Integer> map = ...;// create a map which can hold key as first character and value as number of occurances of that character

for (String input : userInputs) {//iterate over the user inputs
    Integer count = map.get(input.charAt(0));
    if (count == null) count = 0;
    map.put(input.charAt(0), count + 1);//for each input insert key as first character and value as 1 if its first time else last count + 1.
}

或者如果你使用的是 Java 8,你可以使用类似的东西:

userInputs.stream().forEach(input -> map.put(input.charAt(0), map.getOrDefault(input.charAt(0), 0) + 1));

【讨论】:

  • 只有Java的Map接口中没有getOrElse(...)方法。从 Java 8 开始就有getOrDefault(...)
  • 我认为您的意思是 getOrDefault,而这只是在 Java 8 中添加的 - 所以您的两个建议都只适用于此。
  • @SMA 但两个答案仍然只适用于 Java 8。
  • 我明白你的意思@AndyTurner
  • 如果您使用的是 java 8 功能,您也可以使用Map.computeuserInputs.stream().forEach(input -&gt; map.compute(input.charAt(0), (c, n) -&gt; n == null ? 1 : n+1));(一次查找与两次查找)
【解决方案2】:

只需遍历队列并通过将其拆分为 char 数组来检查第一个字母,如果找到匹配的字母,则增加特定的计数器。

【讨论】:

    【解决方案3】:

    使用Map&lt;Character, Queue&lt;String&gt;&gt; 存储姓名并调用m.get('I').size() 进行计数如何...?

    例如

    // for adding name to map use following piece of code
    
    Character c = Character.toUpperCase(name.charAt(0));
    
    if (m.containsKey(c)) {
        m.get(c).add(name)
    } else {
        Queue<String> l = new LinkedList<String>();
        l.add(name);
        m.put(name.charAt(0), l);
    }
    

    请参阅集合 API。

    【讨论】:

      【解决方案4】:

      使用循环检查这个简单的实现 - 也就是说,如果您对一个字母感兴趣。否则我推荐地图解决方案。

          Queue<String> names = new LinkedList<String>();
          //You need to fill the queue
      
          //The starting letter
          String ch = "a";
      
      
          int count = 0;
          for(String name : names)) {
       if (name.toLowerCase().startsWith(ch)) {
                  ++count;
              }
          }
          System.out.printf("%d names start with %s%n", count, ch);
      

      【讨论】:

      • 为什么不只是String ch = "a"?它已经是小写的了,不需要重复构建字符串。此外,输出显示需要多个起始字母。
      • “以相同的第一个字符开头”。所以保存假设是:输入是一个字符,而不是一个字符串。但是,是的,首先拥有一个字符串会让事情变得更容易。但是这种方式(把它拼出来)我认为对学习者来说更好。
      • 我不同意。学习 Java 的人可能会看到 "".Character.toLowerCase(ch) 并认为“有经验的人建议这样做,所以我也应该这样做”。更简单、更易读的代码更好。
      【解决方案5】:
          String[] list = {};
          int[] count = new int[26];
          for(String name : list){
              char firstChar = Character.toLowerCase(name.charAt(0));
              count[firstChar - 97]++;
              //97 is the ascii value for 'a'
          }
      

      @SMA 的回答适用于所有情况,如果您想避免使用哈希图,您也可以这样做。我认为你忽略了大小写。

      【讨论】:

        猜你喜欢
        • 2016-04-14
        • 2023-02-21
        • 2021-09-16
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 2019-10-22
        • 2018-09-03
        • 1970-01-01
        相关资源
        最近更新 更多