使用Scanner在for循环中逐个字母地分析字符串(抛出IndexOutOfBoundExceptions)

时间:2018-11-11 15:26:37

标签: java java.util.scanner

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

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

  

Scanner s = new Scanner(String)

,然后使用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循环创建一个新单词字符串来添加每个字符串的想法。charAt(i)!='') 。

编辑:我忘记了扫描仪在for循环中,我将其取出。其次,不确定它是否会改变很重要,但是我试图计算字符串中每个字母出现的次数,而不仅仅是一种字母。感谢您的评论!

先谢谢了,
凯文

5 个答案:

答案 0 :(得分:0)

这是解决另一个问题上提供的此问题的另一种方法。 (尚不能发表评论..因此必须作为答案...) How to count frequency of characters in a string?

答案 1 :(得分:0)

我强烈认为您正在使用该方法使事情复杂化。您只需将String(以及您要搜索的char)传递给一种方法,就像下面的方法一样:

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;
}

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

答案 2 :(得分:0)

同时具有:

Scanner s = new Scanner(outputString);

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

如果您已经有一个名为String的{​​{1}},则可以按照以下方式直接访问其字符/字母:

outputString

答案 3 :(得分:0)

您应该按照上述解决方案来获取字符串中的重复字符。但是,我仅向您提示您为什么会收到例外情况

考虑以下代码:

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);
  }

答案 4 :(得分:0)

首先,每次准备下一个字符时,都不要创建Bound。在new Scanner之前只做一次。

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

第三-您使用scan.next()分析字符串,这样就可以了(不是最佳和开销,但可以)。然后,创建一个新的Scanner符号,并依靠它的数据,而不是goven字符串的长度;请使用Scanner方法。我的意思是,您只需要添加Scanner.hasNext(),以确保扫描仪的流中存在更多字符:

hasNext()

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

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
    }
}