【问题标题】:Java String count letter occurrencesJava 字符串计数字母出现次数
【发布时间】:2017-05-02 21:17:08
【问题描述】:

我是一名新的 Java 程序员。我正在尝试从用户输入的字符串中进行搜索,以查找特定字符的出现次数。

它并没有完全达到我想要的效果,因为它似乎显示了从字符第一次出现的点开始的字符数。对于这个项目,我需要使用.indexOf() 这是我的代码。

import java.util.Scanner;
public class SearchingStrings {

public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    System.out.println("Please enter the string to test > ");
    String stringToTest = input.nextLine();

    System.out.println("Please enter the letter to count >");

    String letterToCount = input.nextLine();

    // first position found
    int positionOfLetter = stringToTest.indexOf(letterToCount);;

    if (positionOfLetter != -1) {

        int countNumberOfLetters = 1;

        for (int i = positionOfLetter + 1; i < stringToTest.length() - 1; i++) {

            positionOfLetter = stringToTest.substring(positionOfLetter, stringToTest.length()).indexOf(letterToCount);

            if (positionOfLetter != -1) {
                countNumberOfLetters++;
            }
        }

        System.out.println("Number of letters found: " + countNumberOfLetters);

    } else {
        System.out.println("Your letter " + letterToCount + " was not found in the string!");
    }
}
}

【问题讨论】:

    标签: java string count indexof


    【解决方案1】:

    使用substring 创建一个新的字符串进行搜索除了效率低下之外,这里非常令人困惑。 indexOf 有一个 version,它接受一个索引以开始搜索。这更有效,因为它不会复制部分字符串并大大简化您的代码。例如

    int positionOfLetter = stringToTest.indexOf(letterToCount);
    int countNumberOfLetters = 0;
    
    while (positionOfLetter != -1) {
        countNumberOfLetters++;
        positionOfLetter = stringToTest.indexOf(letterToCount, positionOfLetter + 1);
    }
    
    System.out.println("Number of letters found: " + countNumberOfLetters);
    

    indexOf的第二个参数是起始索引。注意+1,否则它会再次找到相同的字符并且永远不会跳出循环。

    【讨论】:

    • 谢谢,我没想到。
    【解决方案2】:

    你快到了,你可以使用do..while循环来代替for循环来实现这一点,例如:

    String s = "test test1 test2";
    String letter = "t";
    int index = -1, count = 0;
    do{
        index = s.indexOf(letter);
        if(index != -1){
            count++;
            s = s.substring(index + 1);
        }
    }while(index != -1);
    
    System.out.println(count);
    

    【讨论】:

    • 感谢您的及时回复!
    【解决方案3】:
    Matcher m = Pattern.compile(letterToCount).matcher(input);
    int count = 0;
    while (m.find()) {
        count++;
    }
    

    应该也能解决问题。

    【讨论】:

      【解决方案4】:

      计算出现次数的一种厚颜无耻的方法是删除所有出现的次数,并将结果字符串的长度与原始字符串的长度进行比较:

      String removed = stringToTest.replace(letterToCount, "");
      int numOccurrences =
          (stringToTest.length() - removed.length()) / letterToCount.length();
      

      【讨论】:

        【解决方案5】:

        看起来像一个家庭作业问题,因为你写了你需要使用 indexOf 但你没有。如果您的目的是计算一个特定的字母,您可以执行以下操作。

        int counter=0;
            for(int i=0; i<stringToTest.length();i++){
                if(stringToTest.charAt(i).equals(letterToCount)){
                    System.out.println(letterToCount+" appears in "+ i +");
                    counter++;
                }
            }
            System.out.println(letterToCount+" appeared "+counter+" times");
        

        此代码只是遍历 stringToTest 的每个字符并检查它是否等于您想要的字母。 indexOf() 是不必要的

        【讨论】:

          【解决方案6】:

          你可以简单地做到这一点:

          int count = stringToTest.replaceAll(letterToCount, "##").length() - stringToTest.length();
          

          【讨论】:

            【解决方案7】:

            我一直喜欢使用拆分。

            longString.split(subStringToCount).length - 1
            

            所以在

            的情况下
            String longString = "test string with spaces";
            String subStringToCount = " ";
            
            return longString.split(subStringToCount).length - 1;
            

            你会得到 3 个。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-04-05
              • 2013-11-04
              • 2016-01-23
              • 1970-01-01
              • 1970-01-01
              • 2020-07-23
              • 2021-06-11
              • 2015-12-01
              相关资源
              最近更新 更多