2016-07-27 2 views
1

Я пытаюсь использовать indexOf, чтобы найти все вхождения символов «в» в предложении. Например, если предложение было «На днях я пошел туда», он должен вернуться 3.indexOf, чтобы найти все вхождения слова в String

Я могу сделать это до того момента, когда он найдет первый индекс, но я не уверен, как написать цикл. У меня первоначально был цикл for, который искал всю строку, но возвращал полную длину символа строки, а не вхождения моего указанного символа. Как я могу написать цикл, который найдет все вхождения этого слова? Спасибо.

import java.util.Scanner; 

public class TheFinder 
{ 
    public static void main (String[] args) 
    { 
     String theString = ""; 
     Scanner enter = new Scanner(System.in); 

     System.out.println("Please enter a sentence: "); 
     theString = enter.nextLine(); 
     int counter2 = 0; 
     theString.indexOf("the"); 

     if (theString.indexOf("the")!= -1) 
     counter2++; 



     System.out.printf("The characters 'the' were found %d times", counter2); 
     System.out.println(); 

     System.out.println("This was programmed by -----"); 
+0

Я бы порекомендовал вас искать с регулярным выражением. –

+0

Не могли бы вы объяснить, что вы подразумеваете под регулярным выражением? – srmjr

+1

Дублирующий вопрос, вопрос был ранее дан в [этот пост] (http://stackoverflow.com/questions/275944/java-how-do-i-count-the-number-of-occurrences-of-a-char -in-a-string) – Hatley

ответ

7

Вы можете следить за индексом:

int index = theString.indexOf("the"); 
while(index >= 0) { 
    index = theString.indexOf("the", index+1); 
    counter2++; 
} 
+0

Нет необходимости в двух вызовах 'indexOf()': for (int idx = 0; (idx = theString.indexOf ("the", idx))> = 0; idx ++) {counter2 ++; } ' – Andreas

3

Вы предприняли сложный подход. Попробуйте это:

int count = str.split("the").length - 1; 

Если вы абсолютно необходимо использовать indexOf():

str = str.toLowerCase(); 
int count = 0; 
for (int i = str.indexOf("the"); i >= 0; i = str.indexOf("the", i + 1)) 
    count++; 
+0

Спасибо за ваш вклад, но я хотел бы использовать indexOf – srmjr

+0

@srmjr см. обновленный ответ – Bohemian

+0

Спасибо. Является ли .toLowerCase(); используется для поиска всех экземпляров слова, независимо от случая? – srmjr

1

indexOf can take a second argument, который говорит, где начать в строке. Поэтому после того, как вы нашли первое вхождение, вы можете сказать indexOf только поиск строку после этого индекса и т.д.

Этот код должен работать:

public static void main(String[] args) { 
    String theString = "The other day I went over there."; 
    theString = theString.toLowerCase(); 

    int index = -1; 
    int count = 0; 

    while (true) { 
     index = theString.indexOf("the", index + 1); 
     if (index == -1) { 
      break; 
     } else { 
      count += 1; 
     } 
    } 

    System.out.printf("The string 'the' was found %d times.\n", count); 

    // Output: 
    // The string 'the' was found 3 times. 
} 
1

Метод indexOf(String str) находит индекс сперва возникновение str. Так что если вы хотите, чтобы найти все в occurrances из str, то я предлагаю просто реализует цикл, в котором вы вырезать строку, как только вы найдете экземпляр str и не искать str в theString снова до тех пор, пока больше не theString. Вот то, что она должна выглядеть,

int index = theString.indexOf("the") 
int count = 0; 
while(index >= 0 && theString.length() > 0){ 
    count++; 
    theString = theString.substring(0, index + "the".length()); 
    index = theString.indexOf("the"); 
} 
+0

Это неправильно. Цикл while будет застревать в бесконечном цикле, поскольку переменная 'index' никогда не обновляется. –

+0

@JonathanJeffrey Спасибо, я только что исправил это. Это была ленивая ошибка с моей стороны. –

1

Если вы хотите использовать специально indexOf (я предполагаю, что это для назначения), вы можете использовать рекурсивный метод.

public static String numMatches (String str, String query) { 
    int index = str.indexOf(query); 
    if (index == -1) 
     return 0; 
    else 
     return 1 + numMatches(str.substring(index + query.length), query); 
} 
0

Может быть, вы можете сделать что-то вроде этого, вы можете использовать IndexOf (String ул)

String word = "We are students of the Department of Informatics. All students should know how to program in Java and C."; 

    int findit = word.indexOf("students"); 
    int count = 0; 

    for(int i=0; i<=findit; i++) 
    { 

     findit = word.indexOf("students" , findit + 1); 

     count = count + 1; 

    } 

    System.out.print(count); 
0

Это проверяет, сколько вхождений строки внутри строки.

   String str = oIn.nextLine(); 
      String st = oIn.nextLine(); 
      int countS = 0; 
      int index3 = str3.indexOf(st); 
      while (index >= 0){ 
      index = str.indexOf(st, index+1); 
      countS++;   
      } 
      System.out.println("The number of occurrences of "+st +" in the string " +str3 +" are "+countS); 
Смежные вопросы