2017-05-02 122 views
2

我是一个新的java程序员。我试图从用户输入的字符串中进行搜索,以查找特定字符的出现次数。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!"); 
    } 
} 
} 

回答

3

使用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,否则它将再次找到相同的字符,并且永远不会跳出循环。

+0

谢谢,我没有想到这一点。 –

3

你是几乎没有,而不是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); 
+0

谢谢您的及时回复! –

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

也应该这样做。

0

因为你写了你似乎需要使用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()是不必要的

1

面露方法来计算出现的次数是删除所有出现的,并且生成的字符串的长度比原来的:

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

你可以简单地这样做绝招:

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