Java 字符串计数字母出现次数

Java String count letter occurrences

我是一名新 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!");
    }
}
}

你快完成了,而不是 for 循环,你可以使用 do..while 循环来实现这个,例如:

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

使用 substring 创建一个新的 String 进行搜索除了效率低下之外,这里非常混乱。 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 否则它会再次找到相同的字符并且永远不会跳出循环。

Matcher m = Pattern.compile(letterToCount).matcher(input);
int count = 0;
while (m.find()) {
    count++;
}

也应该这样做。

这似乎是一道家庭作业题,因为您写到您需要使用 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() 是不必要的

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

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

你可以简单地做这个技巧:

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

我一直喜欢使用 split。

longString.split(subStringToCount).length - 1

所以在

的情况下
String longString = "test string with spaces";
String subStringToCount = " ";

return longString.split(subStringToCount).length - 1;

你会得到 3 个。