【问题标题】:Using Scanner to analyse a string, letter by letter, in a for loop (Throwing IndexOutOfBoundExceptions)使用 Scanner 在 for 循环中逐字母分析字符串(引发 IndexOutOfBoundExceptions)
【发布时间】:2018-11-11 15:26:36
【问题描述】:

我需要计算一个字母在字符串中出现的频率。

为此,我考虑过使用扫描仪对象,将字符串传递给它

扫描仪 s = 新的扫描仪(字符串)

并使用 next() 方法通过 switch 语句分析每个字符。

我在这些板上进行了搜索并设计了以下内容:-

for (int i = 0; i < outputString.length(); i++) {
    Scanner s = new Scanner(outputString);
    char letter = s.next().charAt(i);
    switch (letter) {
    switch code;
}

当我正在分析的字符串包含除空格以外的任何内容(-_z1 等)时,这似乎有效,这将导致程序抛出 String.IndexOutOfBoundException (4)。

还有什么我可以尝试的,或者我应该从单词中删除所有空格(即我正在考虑通过使用 for 循环创建一个新单词字符串来添加每个 string.charAt(i) != ' ') .

编辑:我忘记了扫描仪在 for 循环中,我将其取出。其次,不确定它是否会发生变化,但我正在尝试计算字符串中字母表中每个字母出现的次数,而不仅仅是一种字母。感谢您的 cmets!

提前致谢,

【问题讨论】:

  • 这段代码没有多大意义。如果目标是遍历 outputString 的每个字母,为什么要创建一个 Scanner 并调用 next(),而不是直接获取 outputString 的索引 i 处的字符?
  • 我了解您要达到的目标,但这是一种复杂的方式。为什么不获取String对象中的String,然后直接手动检查呢?
  • @JBNizet - 我不确定,它一定已经跳过了我的想法。我现在已将其更改为 outputString.charAt(i),它更简洁 - 无需删除任何空格!

标签: java java.util.scanner


【解决方案1】:

这是另一个问题提供的解决此问题的替代方法。 (还不能离开cmets ..所以必须作为答案...) How to count frequency of characters in a string?

【讨论】:

    【解决方案2】:

    虽然有这个:

    Scanner s = new Scanner(outputString);
    

    for 循环中,您在每次迭代中创建一个新的Scanner(效率不高,也不是您想要的)。

    如果您已经有一个名为outputStringString,您可以按如下方式直接访问其字符/字母:

    for (int i = 0; i < outputString.length(); i++) {
        char letter = outputString.charAt(i);
        //The rest of you code here
    }
    

    【讨论】:

      【解决方案3】:

      我强烈认为您使用这种方法会使事情复杂化。您可以简单地将字符串(以及您要搜索的字符)传递给一个方法,如下所示:

      public int checkFreq(char letter, String word){
          int freq = 0;
      
          for(int i = 0; i < word.length(); i++){
              if((word.charAt(i)) == letter){
                  freq++;
              }
          }
      
          return freq;
      }
      

      我希望这会有所帮助.. 编码愉快!

      【讨论】:

        【解决方案4】:

        您应该按照上述解决方案来获取字符串中的重复字符。但是,我只会提示您为什么会收到异常

        考虑以下代码:

        String outputString = "Pre ";
        for (int i = 0; i < outputString.length(); i++) {
              Scanner s = new Scanner(outputString);
              System.out.println(outputString.length()); // output is 4
              System.out.println(s.next().length()); //output is 3, not considering the space
              //char letter = s.next().charAt(i);
              //System.out.println(letter);
          }

        【讨论】:

          【解决方案5】:

          首先,你不应该在每次准备好下一个角色时都创建new Scanner。只做一次,在for loop之前。

          第二 - 要逐个字符读取扫描仪,您已将delimeter 设置为""。在这种情况下,scan.next() 返回下一个字符。

          第三 - 你使用Scanner 来分析字符串,没关系(不是最优和开销,但没关系)。然后创建新的Scanner isntance 并依赖它的数据,而不是指定字符串的长度;请使用Scanner.hasNext() 方法。我的意思是您只需要添加hasNext() 以确保扫描仪的流中存在更多字符:

          try (Scanner scan = new Scanner(outputString)) {
              scan.useDelimiter("");  // to make scan.next() return one single character
          
              while (scan.hasNext()) {
                  char ch = scan.next().charAt(0);    // next() returns String with one character
                  // do your work
              }
          }
          

          P.S. 这是代码示例,如何用不同的方式计算给定字符串中的字符频率。您可能会发现其中之一与您的任务更相关。

          // this is your approach
          public static int characterFrequency(String str, char ch) {
              try (Scanner scan = new Scanner(str)) {
                  scan.useDelimiter("");
                  int count = 0;
          
                  while (scan.hasNext())
                      count += scan.next().charAt(0) == ch ? 1 : 0;
          
                  return count;
              }
          }
          
          // this one is the most efficient
          public static int characterFrequency(String str, char ch) {
              int count = 0;
          
              for (int i = 0; i < str.length(); i++)
                  count += str.charAt(i) == ch ? 1 : 0;
          
              return count;
          }
          
          // this one is the smallest of code
          public static int characterFrequency(String str, char ch) {
              return (int)str.chars().filter(e -> e == ch).count();
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-08-02
            • 2013-03-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-03
            • 1970-01-01
            相关资源
            最近更新 更多