считать вхождение символа в заданную строку - PullRequest
1 голос
/ 05 марта 2012

Я остановился на следующем коде для подсчета появления символа в строке:

public static void main(String[] args) {
    String source = "hello low how ale you";
    Scanner in = new Scanner(System.in);
    String temp = in.nextLine();
    char test = temp.toCharArray()[0];

    int fromIndex = 0;
    int occurences =0;

        while(fromIndex>-1)
        {
        fromIndex = source.indexOf(test, fromIndex);
        System.out.println("found at"+fromIndex);
        //if(fromIndex!=-1) occurences++;
        }
    System.out.println(occurences);
    }

Цикл выполняется бесконечно, если закомментирована строка if (fromIndex! = - 1)! Цикл правильно завершается, если та же строка не закомментирована. Странно наблюдать, что завершение цикла зависит от переменной fromIndex, а не от обновления переменной occurences, которая обновляется внутри блока If.

Есть предположения, почему это происходит?

Ответы [ 3 ]

0 голосов
/ 05 марта 2012

Если вы не строго придерживаетесь подхода, подобного вашему коду, я предлагаю вам использовать регулярное выражение.У вас будет чище и меньше кода тоже.Попробуйте фрагмент кода ниже, допустим, у вас есть символ ch:

char ch = 'o';
String input = "Hi there boys! Come on!";
String regex = ch + "";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);

ArrayList<String> matches = new ArrayList<String>();
while (m.find())
    matches.add(m.group());

System.out.println(matches.size());
0 голосов
/ 05 марта 2012

значение fromIndex не меняется в последующих итерациях.Вот причина бесконечного цикла. Это потому, что fromIndex даст точный индекс символа.увеличьте fromIndex на 1 для следующего цикла, и это решит проблему.

while(fromIndex>-1)         
            {         
                fromIndex = source.indexOf(test, fromIndex+1);         
                System.out.println("found at"+fromIndex);         
                if(fromIndex!=-1) occurences++;         
                }          
            }       

Надеюсь, это поможет.

0 голосов
/ 05 марта 2012

Я думаю, вы пытаетесь сделать что-то вроде ниже.

public class Solution {
    public static void main(String[] args) {
        String source = "hello low how ale you";
        char test = 'u';
        int fromIndex = 0;
        int occurrences = 0;
        int length = source.length();
        while (fromIndex < length) {
            int index = source.indexOf(test, fromIndex);
            if (index != -1) {
                occurrences++;
                fromIndex = index;
            }
            fromIndex++;
        }
        System.out.println(occurrences);
    }
}


Некоторое объяснение

  1. Предположим, вам нужно найти 'h' в данной строке, вы начнете с 0, поэтому ваша инициализация fromIndex будет равна 0.
  2. Вы ищете от начальной позиции до конца строки. Вот почему в цикле while вы должны указать свое условие как fromIndex < length.
  3. Теперь попробуйте найти вхождение вашего теста. Если есть тестовый персонаж, вы получите его характер. Иначе вы получите -1. Сохраните его в index.
  4. Теперь, если index не равно -1, присвойте его fromIndex. Потому что теперь вы будете искать, начиная с этой позиции. Снова не с 0.
  5. Увеличение fromIndex. Это будет сделано независимо от значения переменной index.

    Теперь проанализируйте ваш код на наличие ошибок.
...